Open In App

Print N terms of Withoff Sequence

Last Updated : 31 Aug, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Wythoff array is an infinite matrix of integers derived from the Fibonacci sequence. Every positive integer in the matrix occurs only once. 
Wythoff array: 
 

  1    2    3    5    8    13    ...
  
  4    7    11   18   29   47    ...
                        
  6    10   16   26   42   68    ...
   
  9    15   24   39   63   102   ...
  
  12   20   32   52   84   136   ...
  
  14   23   37   60   97   157   ...

  .    .    .    .    .    .
  .    .    .    .    .    . 

If Am, n denotes the element in the mth row and nth column then 
 

  • Am, 1 = [[m?]?]
  • Am, 2 = [[m?]?2]
  • Am, n = Am, n-2 + Am, n-1 for n > 2
  • ? = (1 + ?5) / 2

If we traverse matrix in an anti-diagonal way starting from top-left element then 
Wythoff sequence: 
 

1, 2, 4, 3, 7, 6, 5, 11, 10, 9…. 

For a given N, the task to print first N numbers of the sequence.
Examples: 
 

Input : N = 10 
Output : 1, 2, 4, 3, 7, 6, 5, 11, 10, 9 
Input : N = 15 
Output : 1, 2, 4, 3, 7, 6, 5, 11, 10, 9, 8, 18, 16, 15, 12 
 

 

Approach: 
The above recursions can be modified as 
 

  • T(n, -1) = n-1, if k = -1
  • T(n, 0) = [n*?], if k = 0
  • T(n, k) = T(n, k-1) + T(n, k-2), if k > 0
  • ? = (1 + ?5) / 2

So we can recursively find the value of T(n, k) with two base cases for t = 0 and for t = –1. we will store the values in a map and use it when needed to reduce computation. After we get the array we have to traverse it in an anti- diagonal way, so we set i=0 and j=0 and decrease the j and increase i when the j < 0 we initialise j = i and i = 0
we also keep a count which is increased when a number is displayed. We break the array when the count reaches the required value.
Below is the implementation of the above approach :
 

CPP




// C++ program to find Wythoff array
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the n, k term of Wythoff array
int Wythoff(map<int, map<int, int> >& mp, int n, int k)
{
    // tau = (sqrt(5)+1)/2
    double tau = (sqrt(5) + 1) / 2.0, t_n_k;
 
    // Already_stored
    if (mp[n][k] != 0)
        return mp[n][k];
 
    // T(n, -1) = n-1.
    if (k == -1) {
        return n - 1;
    }
     
    // T(n, 0) = floor(n*tau).
    else if (k == 0) {
        t_n_k = floor(n * tau);
    }
     
    // T(n, k) = T(n, k-1) + T(n, k-2) for k>=1.
    else
    {
        t_n_k = Wythoff(mp, n, k - 1) +
                             Wythoff(mp, n, k - 2);
    }
 
    // Store
    mp[n][k] = t_n_k;
 
    // Return the ans
    return (int)t_n_k;
}
 
// Function to find  first n terms of Wythoff
// array by traversing in anti-diagonal
void Wythoff_Array(int n)
{
    int i = 0, j = 0, count = 0;
 
    // Map to store the Wythoff array
    map<int, map<int, int> > mp;
 
    while (count < n) {
 
        cout << Wythoff(mp, i + 1, j + 1);
        count++;
         
        if(count != n)
            cout << ", ";
 
        // Anti diagonal
        i++;
        j--;
 
        if (j < 0) {
            j = i;
            i = 0;
        }
    }
}
 
// Driver code
int main()
{
    int n = 15;
     
    // Function call
    Wythoff_Array(n);
     
    return 0;
}


Java




// Java program to find Wythoff array
import java.util.*;
public class GFG
{
 
  // Function to find the n, k term of Wythoff array
  static int Wythoff(HashMap<Integer,
                     HashMap<Integer, Integer>> mp,
                     int n, int k)
  {
 
    // tau = (sqrt(5)+1)/2
    double tau = (Math.sqrt(5) + 1) / 2.0, t_n_k;
 
    // Already_stored
    if (mp.containsKey(n) &&
        mp.get(n).containsKey(k) &&
        mp.get(n).get(k) != 0)
      return mp.get(n).get(k);
 
    // T(n, -1) = n-1.
    if (k == -1)
    {
      return n - 1;
    }
 
    // T(n, 0) = floor(n*tau).
    else if (k == 0)
    {
      t_n_k = Math.floor(n * tau);
    }
 
    // T(n, k) = T(n, k-1) + T(n, k-2) for k>=1.
    else
    {
      t_n_k = Wythoff(mp, n, k - 1) +
        Wythoff(mp, n, k - 2);
    }
 
    // Store
    mp.put(n, new HashMap<Integer, Integer>(k,(int)t_n_k));
 
    // Return the ans
    return (int)t_n_k;
  }
 
  // Function to find  first n terms of Wythoff
  // array by traversing in anti-diagonal
  static void Wythoff_Array(int n)
  {
    int i = 0, j = 0, count = 0;
 
    // Map to store the Wythoff array
    HashMap<Integer, HashMap<Integer,Integer>> mp =
      new HashMap<Integer, HashMap<Integer,Integer>>();
    while (count < n)
    {
      System.out.print(Wythoff(mp, i + 1, j + 1));
      count++;
      if(count != n)
        System.out.print(", ");
 
      // Anti diagonal
      i++;
      j--;
 
      if (j < 0)
      {
        j = i;
        i = 0;
      }
    }
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int n = 15;
 
    // Function call
    Wythoff_Array(n);
  }
}
 
// This code is contributed by divyeshrabadiya07.


Python3




# Python3 program to find Wythoff array
import math
 
# Function to find the n, k term of Wythoff array
def Wythoff(mp, n, k):
 
    # tau = (sqrt(5)+1)/2
    tau = (math.sqrt(5) + 1) / 2
    t_n_k = 0
 
    # Already_stored
    if ((n in mp) and (k in mp[n])):
        return mp[n][k];
 
    # T(n, -1) = n-1.
    if (k == -1):
        return n - 1;
     
    # T(n, 0) = floor(n*tau).
    elif (k == 0):
        t_n_k = math.floor(n * tau);
     
    # T(n, k) = T(n, k-1) + T(n, k-2) for k>=1.
    else:
        t_n_k = Wythoff(mp, n, k - 1) + Wythoff(mp, n, k - 2)
     
    # Store
    if n not in mp:
        mp[n] = dict()
    mp[n][k] = t_n_k;
 
    # Return the ans
    return int(t_n_k)
 
# Function to find  first n terms of Wythoff
# array by traversing in anti-diagonal
def Wythoff_Array(n):
 
    i = 0
    j = 0
    count = 0;
 
    # Map to store the Wythoff array
    mp = dict()
 
    while (count < n):
 
        print(Wythoff(mp, i + 1, j + 1), end = '')
        count += 1
         
        if(count != n):
            print(", ", end = '')
 
        # Anti diagonal
        i += 1
        j -= 1
 
        if (j < 0):
            j = i;
            i = 0;
         
# Driver code
if __name__=='__main__':
 
    n = 15;
     
    # Function call
    Wythoff_Array(n);
 
    # This code is contributed by rutvik_56


C#




// C# program to find Wythoff array
using System;
using System.Collections.Generic;
class GFG
{
 
  // Function to find the n, k term of Wythoff array
  static int Wythoff(Dictionary<int, Dictionary<int, int>> mp, int n, int k)
  {
 
    // tau = (sqrt(5)+1)/2
    double tau = (Math.Sqrt(5) + 1) / 2.0, t_n_k;
 
    // Already_stored
    if (mp.ContainsKey(n) && mp[n].ContainsKey(k) && mp[n][k] != 0)
      return mp[n][k];
 
    // T(n, -1) = n-1.
    if (k == -1) {
      return n - 1;
    }
 
    // T(n, 0) = floor(n*tau).
    else if (k == 0)
    {
      t_n_k = Math.Floor(n * tau);
    }
 
    // T(n, k) = T(n, k-1) + T(n, k-2) for k>=1.
    else
    {
      t_n_k = Wythoff(mp, n, k - 1) + Wythoff(mp, n, k - 2);
    }
 
    // Store
    if(!mp.ContainsKey(n))
    {
      mp[n] = new Dictionary<int,int>();
    }
    mp[n][k] = (int)t_n_k;
 
    // Return the ans
    return (int)t_n_k;
  }
 
  // Function to find  first n terms of Wythoff
  // array by traversing in anti-diagonal
  static void Wythoff_Array(int n)
  {
    int i = 0, j = 0, count = 0;
 
    // Map to store the Wythoff array
    Dictionary<int, Dictionary<int,int>> mp = new Dictionary<int, Dictionary<int,int>>();
    while (count < n)
    {
 
      Console.Write(Wythoff(mp, i + 1, j + 1));
      count++;
      if(count != n)
        Console.Write(", ");
 
      // Anti diagonal
      i++;
      j--;
 
      if (j < 0) {
        j = i;
        i = 0;
      }
    }
  }
 
  // Driver code
  static void Main()
  {
    int n = 15;
 
    // Function call
    Wythoff_Array(n);
  }
}
 
// This code is contributed by divyesh072019.


Javascript




// JS program to find Wythoff array
 
// Function to find the n, k term of Wythoff array
function Wythoff(mp, n, k)
{
 
    // tau = (sqrt(5)+1)/2
    let tau = (Math.sqrt(5) + 1) / 2.0, t_n_k;
 
    // Already_stored
    if (mp.hasOwnProperty(n) && mp[n].hasOwnProperty(k)
        && mp[n][k] != 0)
        return mp[n][k];
 
    // T(n, -1) = n-1.
    if (k == -1) {
        return n - 1;
    }
 
    // T(n, 0) = floor(n*tau).
    else if (k == 0) {
        t_n_k = Math.floor(n * tau);
    }
 
    // T(n, k) = T(n, k-1) + T(n, k-2) for k>=1.
    else {
        t_n_k
            = Wythoff(mp, n, k - 1) + Wythoff(mp, n, k - 2);
    }
 
    // Store
    if (!mp.hasOwnProperty(n)) {
        mp[n] = {};
    }
    mp[n][k] = Math.floor(t_n_k);
 
    // Return the ans
    return Math.floor(t_n_k);
}
 
// Function to find  first n terms of Wythoff
// array by traversing in anti-diagonal
function Wythoff_Array(n)
{
    let i = 0, j = 0, count = 0;
 
    // Map to store the Wythoff array
    let mp = {};
    while (count < n) {
 
        process.stdout.write(""
                             + Wythoff(mp, i + 1, j + 1));
        count++;
        if (count != n)
            process.stdout.write(", ");
 
        // Anti diagonal
        i++;
        j--;
 
        if (j < 0) {
            j = i;
            i = 0;
        }
    }
}
 
// Driver code
let n = 15;
 
// Function call
Wythoff_Array(n);
 
// This code is contributed by phasing17.


Output: 
 

1, 2, 4, 3, 7, 6, 5, 11, 10, 9, 8, 18, 16, 15, 12, 

Reference : https://oeis.org/A035513
 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads