Program to find Nth term of the Van Eck's Sequence - GeeksforGeeks

13 May, 2022
Given a positive integer N, the task is to print Nth term of the Van Eck’s sequence.In mathematics, Van Eck’s sequence is an integer sequence which is defined recursively as follows:  
Let the first term be 0 i.e a0 = 0.
Then for n >= 0, if there exists an m < n such that
am = an
take the largest such m and set an+1 = n − m;
Otherwise an+1 = 0.
Start with a(1)=0.
First few terms of Van Eck’s Sequence are as follows:  
0, 0, 1, 0, 2, 0, 2, 2, 1, 6, 0, 5, 0, 2, 6, 5, 4, 0, 5 ...  
Example:  
Input: N = 5
Output: 2

Input: N = 10
Output: 6 
Approach: As described above we can follow the below steps to generate Van Eck’s sequence:  
Set the first term of the sequence as 0.
Then Repeatedly apply: If the last term has not occurred yet and is new to the sequence so far then, set the next term as zero.Otherwise, the next term is how far back this last term has occurred previously.
If the last term has not occurred yet and is new to the sequence so far then, set the next term as zero.
Otherwise, the next term is how far back this last term has occurred previously.
Once the sequence is generated we can get our nth term easily.
Below is the implementation of above approach: 
C++
Java
Python3
C#
Javascript
// C++ program to print Nth// term of Van Eck's sequence #include <bits/stdc++.h>using namespace std; #define MAX 1000int sequence[MAX]; // Utility function to compute// Van Eck's sequencevoid vanEckSequence(){     // Initialize sequence array    for (int i = 0; i < MAX; i++) {        sequence[i] = 0;    }     // Loop to generate sequence    for (int i = 0; i < MAX; i++) {         // Check if sequence[i] has occurred        // previously or is new to sequence        for (int j = i - 1; j >= 0; j--) {            if (sequence[j] == sequence[i]) {                 // If occurrence found                // then the next term will be                // how far back this last term                // occurred previously                sequence[i + 1] = i - j;                break;            }        }    }} // Utility function to return// Nth term of sequenceint getNthTerm(int n){     return sequence[n];} // Driver codeint main(){     // Pre-compute Van Eck's sequence    vanEckSequence();     int n = 6;     // Print nth term of the sequence    cout << getNthTerm(n) << endl;     n = 100;     // Print nth term of the sequence    cout << getNthTerm(n) << endl;     return 0;}
// Java program to print Nth// term of Van Eck's sequence class GFG {     static int MAX = 1000;     // Array to store terms of sequence    static int sequence[] = new int[MAX];     // Utility function to compute    // Van Eck's sequence    static void vanEckSequence()    {         // Initialize sequence array        for (int i = 0; i < MAX - 1; i++) {            sequence[i] = 0;        }         // Loop to generate sequence        for (int i = 0; i < MAX - 1; i++) {             // Check if sequence[i] has occurred            // previously or is new to sequence            for (int j = i - 1; j >= 0; j--) {                if (sequence[j] == sequence[i]) {                     // If occurrence found                    // then the next term will be                    // how far back this last term                    // occurred previously                    sequence[i + 1] = i - j;                    break;                }            }        }    }     // Utility function to return    // Nth term of sequence    static int getNthTerm(int n)    {         return sequence[n];    }     // Driver code    public static void main(String[] args)    {         // Pre-compute Van Eck's sequence        vanEckSequence();         int n = 6;         // Print nth term of the sequence        System.out.println(getNthTerm(n));         n = 100;         // Print nth term of the sequence        System.out.println(getNthTerm(n));    }}
# Python3 program to print Nth# term of Van Eck's sequenceMAX = 1000sequence = [0] * (MAX + 1); # Utility function to compute# Van Eck's sequencedef vanEckSequence() :     # Initialize sequence array    for i in range(MAX) :        sequence[i] = 0;     # Loop to generate sequence    for i in range(MAX) :                 # Check if sequence[i] has occurred        # previously or is new to sequence        for j in range(i - 1 , -1, -1) :            if (sequence[j] == sequence[i]) :                 # If occurrence found                # then the next term will be                # how far back this last term                # occurred previously                sequence[i + 1] = i - j;                break; # Utility function to return# Nth term of sequencedef getNthTerm(n) :     return sequence[n]; # Driver codeif __name__ == "__main__" :     # Pre-compute Van Eck's sequence    vanEckSequence();     n = 6;     # Print nth term of the sequence    print(getNthTerm(n));     n = 100;     # Print nth term of the sequence    print(getNthTerm(n)); # This code is contributed by kanugargng
// C# program to print Nth// term of Van Eck's sequence using System;class GFG {     static int MAX = 1000;     // Array to store terms of sequence    static int[] sequence = new int[MAX];     // Utility function to compute    // Van Eck's sequence    static void vanEckSequence()    {         // Initialize sequence array        for (int i = 0; i < MAX - 1; i++) {            sequence[i] = 0;        }         // Loop to generate sequence        for (int i = 0; i < MAX - 1; i++) {             // Check if sequence[i] has occurred            // previously or is new to sequence            for (int j = i - 1; j >= 0; j--) {                if (sequence[j] == sequence[i]) {                     // If occurrence found                    // then the next term will be                    // how far back this last term                    // occurred previously                    sequence[i + 1] = i - j;                    break;                }            }        }    }     // Utility function to return    // Nth term of sequence    static int getNthTerm(int n)    {         return sequence[n];    }     // Driver code    public static void Main()    {         // Pre-compute Van Eck's sequence        vanEckSequence();         int n = 6;         // Print nth term of the sequence        Console.WriteLine(getNthTerm(n));         n = 100;         // Print nth term of the sequence        Console.WriteLine(getNthTerm(n));    }}
<script> function getVanEckSequence(n) {    let result = [0];      let dir = {};            for( let i = 0 ; i < n ; i++) {          const currentData = result[i];        const currentPosition = i + 1;                  // If number is already there, then insert the difference of positions.        if (dir[currentData]) {            result.push(currentPosition - dir[currentData]);        } else {             result.push(0);        }                 // Update with the latest position        dir[currentData] = currentPosition;     }    return result;} console.log(getVanEckSequence(100));  // This code is contributed by Devesh</script>
2
23
 
Time Complexity: O(MAX2)
Auxiliary Space: O(MAX)
Method 2: Using lambda functions There is no need to store the entire sequence to get the value of nth term. We can recursively build the series upto nth term and find only the value of nth term using the lambda expression.Below is the implementation of the above approach using lambda function:  
Python3
# Python3 program to find# Nth term of Van Eck's sequence# using the lambda expression # Lambda function f = lambda n, l = 0, *s : f(n-1, l in s and ~s.index(l), l, *s) \if n else -l # The above lambda function recursively# build the sequence and store it in tuple s # The expression l in s and ~s.index(l)# returns False if l is not present in tuple s# otherwise, returns the negation of the value of# the index of l in tuple s# and is appended to tuple s# Thus, tuple s store negation of all the elements# of the sequence in reverse order # At the end, when n reaches 0, function converts# the nth term back to its actual value# and returns it.    # Driver coden = 6 # Get Nth term of the sequenceprint(f(n)) n = 100# Get Nth term of the sequenceprint(f(n))
2
23
 
Reference: https://codegolf.stackexchange.com/questions/186654/nth-term-of-van-eck-sequence 
kanugargng
nidhi_biet
itsok
gabaa406
subhammahato348
devesh ballani
series
Mathematical
Mathematical
series
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program to print prime numbers from 1 to N.
Segment Tree | Set 1 (Sum of given range)
Modular multiplicative inverse
Count all possible paths from top left to bottom right of a mXn matrix
Fizz Buzz Implementation
Check if a number is Palindrome
Program to multiply two matrices
Merge two sorted arrays with O(1) extra space
Generate all permutation of a set in Python
Count ways to reach the n'th stair