Related Articles

# Find F(n) when F(i) and F(j) of a sequence are given

• Difficulty Level : Easy
• Last Updated : 03 May, 2021

Given five integers i, Fi, j, Fj and N. Where Fi and Fj are the ith and jth term of a sequence which follows the Fibonacci recurrence i.e. FN = FN – 1 + FN – 2. The task is to find the Nth term of the original sequence.
Examples:

Input: i = 3, F3 = 5, j = -1, F-1 = 4, N = 5
Output: 12
Fibonacci sequence can be reconstructed using known values:
…, F-1 = 4, F0 = -1, F1 = 3, F2 = 2, F3 = 5, F4 = 7, F5 = 12, …
Input: i = 0, F0 = 1, j = 1, F1 = 4, N = -2
Output: -2

Approach: Note that, if the two consecutive terms of the Fibonacci sequence are known then the Nth term can easily be determined. Assuming i < j, as per Fibonacci condition:

Fi+1 = 1*Fi+1 + 0*Fi
Fi+2 = 1*Fi+1 + 1*Fi
Fi+3 = Fi+2 + Fi+1 = 2*Fi+1 + 1*Fi
Fi+4 = Fi+3 + Fi+2 = 3*Fi+1 + 2*Fi
Fi+5 = Fi+4 + Fi+3 = 5*Fi+1 + 3*Fi
.. .. ..
and so on

Note that, the coefficients of Fi+1 and Fi in the above set of equations are nothing but the terms of Standard Fibonacci Sequence.
So, considering the Standard Fibonacci sequence i.e. f0 = 0, f1 = 1, f2 = 1, f3 = 2, f4 = 3, … ; we can generalize, the above set of equations (for k > 0) as:

Fi+k = fk*Fi+1 + fk-1*Fi   …(1)

Now consider,

k = j-i   …(2)

Now, substituting eq.(2) in eq.(1), we get:

Fj = fj-i*Fi+1 + fj-i-1*Fi

Hence, we can calculate Fi+1 from known values of Fi and Fj. Now that we know two consecutive terms of sequence F, we can easily reconstruct F and determine the value of FN.
Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include` `using` `namespace` `std;` `// Function to calculate kth Fibonacci number``// in the standard Fibonacci sequence``int` `fibonacci(``int` `k)``{``    ``int` `a = 0, b = 1, c = 0;``    ``if``( k == 0)``        ``return` `a;``    ``if` `(k == 1)``        ``return` `b;``    ``for``(``int` `i = 2; i < k + 1; i++)``    ``{``        ``c = a + b;``        ``a = b;``        ``b = c;``    ``}``    ``return` `c;``}` `// Function to determine the value of F(n)``int` `determineFn(``int` `i, ``int` `Fi, ``int` `j, ``int` `Fj, ``int` `n)``{``    ``if` `(j < i)``    ``{``        ``swap(i, j);``        ``swap(Fi, Fj);``    ``}` `    ``// Find the value of F(i + 1)``    ``// from F(i) and F(j)``    ``int` `Fi1 = (Fj - fibonacci(j - i - 1) * Fi) /``                    ``fibonacci(j - i);` `    ``// When n is equal to i``    ``int` `Fn = 0;``    ``if` `(n == i)``        ``Fn = Fi;` `    ``// When n is greater than i``    ``else` `if` `(n > i)``    ``{``        ``int` `b = Fi;``        ``Fn = Fi1;``        ``n = n - 1;``        ``while` `(n != i)``        ``{``            ``n = n - 1;``            ``int` `a = b;``            ``b = Fn;``            ``Fn = a + b;``        ``}``    ``}``    ` `    ``// When n is smaller than i``    ``else``    ``{``        ``int` `a = Fi;``        ``int` `b = Fi1;``        ``while` `(n != i)``        ``{``            ``n = n + 1;``            ``Fn = b - a;``            ``b = a;``            ``a = Fn;``        ``}``    ``}``    ``return` `Fn;``}` `// Driver code``int` `main()``{``    ``int` `i = 3;``    ``int` `Fi = 5;``    ``int` `j = -1;``    ``int` `Fj = 4;``    ``int` `n = 5;``    ``cout << (determineFn(i, Fi, j, Fj, n));``}` `// This code is contributed by Mohit Kumar`

## Java

 `// Java implementation of the approach``import` `java.util.*;` `class` `GFG``{` `    ``// Function to calculate kth Fibonacci number``    ``// in the standard Fibonacci sequence``    ``static` `int` `fibonacci(``int` `k)``    ``{``        ``int` `a = ``0``, b = ``1``, c = ``0``;``        ``if` `(k == ``0``)``            ``return` `a;``        ``if` `(k == ``1``)``            ``return` `b;``        ``for` `(``int` `i = ``2``; i < k + ``1``; i++)``        ``{``            ``c = a + b;``            ``a = b;``            ``b = c;``        ``}``        ``return` `c;``    ``}` `    ``// Function to determine the value of F(n)``    ``static` `int` `determineFn(``int` `i, ``int` `Fi,      ``                           ``int` `j, ``int` `Fj, ``int` `n)``    ``{``        ``if` `(j < i)``        ``{` `            ``// Swap i, j``            ``i = i + j;``            ``j = i - j;``            ``i = i - j;` `            ``// swap Fi, Fj``            ``Fi = Fi + Fj;``            ``Fj = Fi - Fj;``            ``Fi = Fi - Fj;``        ``}` `        ``// Find the value of F(i + 1)``        ``// from F(i) and F(j)``        ``int` `Fi1 = (Fj - fibonacci(j - i - ``1``) * Fi) /``                        ``fibonacci(j - i);` `        ``// When n is equal to i``        ``int` `Fn = ``0``;``        ``if` `(n == i)``            ``Fn = Fi;` `        ``// When n is greater than i``        ``else` `if` `(n > i)``        ``{``            ``int` `b = Fi;``            ``Fn = Fi1;``            ``n = n - ``1``;``            ``while` `(n != i)``            ``{``                ``n = n - ``1``;``                ``int` `a = b;``                ``b = Fn;``                ``Fn = a + b;``            ``}``        ``}` `        ``// When n is smaller than i``        ``else``        ``{``            ``int` `a = Fi;``            ``int` `b = Fi1;``            ``while` `(n != i)``            ``{``                ``n = n + ``1``;``                ``Fn = b - a;``                ``b = a;``                ``a = Fn;``            ``}``        ``}``        ``return` `Fn;``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `i = ``3``;``        ``int` `Fi = ``5``;``        ``int` `j = -``1``;``        ``int` `Fj = ``4``;``        ``int` `n = ``5``;``        ``System.out.println(determineFn(i, Fi, j, Fj, n));``    ``}``}` `// This code is contributed by``// sanjeev2552`

## Python3

 `# Python3 implementation of the approach` `# Function to calculate kth Fibonacci number``# in the standard Fibonacci sequence``def` `fibonacci(k):``    ``a ``=` `0``    ``b ``=` `1``    ``if` `k ``=``=` `0``:``        ``return` `a``    ``if` `k ``=``=` `1``:``        ``return` `b``    ``for` `i ``in` `range``(``2``, k ``+` `1``):``        ``c ``=` `a ``+` `b``        ``a ``=` `b``        ``b ``=` `c``    ``return` `c` `# Function to determine``# the value of F(n)``def` `determineFn(i, Fi, j, Fj, n):``    ``if` `ji:``        ``b ``=` `Fi``        ``Fn ``=` `Fi1``        ``n ``=` `n ``-` `1``        ``while` `n !``=` `i:``            ``n ``=` `n ``-` `1``            ``a ``=` `b``            ``b ``=` `Fn``            ``Fn ``=` `a ``+` `b` `    ``# When n is smaller than i``    ``else``:``        ``a ``=` `Fi``        ``b ``=` `Fi1``        ``while` `n !``=` `i:``            ``n ``=` `n ``+` `1``            ``Fn ``=` `b ``-` `a``            ``b ``=` `a``            ``a ``=` `Fn``    ``return` `Fn` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``i ``=` `3``    ``Fi ``=` `5``    ``j ``=` `-``1``    ``Fj ``=` `4``    ``n ``=` `5``    ``print``(determineFn(i, Fi, j, Fj, n))`

## C#

 `// C# implementation of the approach``using` `System;` `class` `GFG``{` `    ``// Function to calculate kth Fibonacci number``    ``// in the standard Fibonacci sequence``    ``static` `int` `fibonacci(``int` `k)``    ``{``        ``int` `a = 0, b = 1, c = 0;``        ``if` `(k == 0)``            ``return` `a;``        ``if` `(k == 1)``            ``return` `b;``        ``for` `(``int` `i = 2; i < k + 1; i++)``        ``{``            ``c = a + b;``            ``a = b;``            ``b = c;``        ``}``        ``return` `c;``    ``}` `    ``// Function to determine the value of F(n)``    ``static` `int` `determineFn(``int` `i, ``int` `Fi,    ``                           ``int` `j, ``int` `Fj, ``int` `n)``    ``{``        ``if` `(j < i)``        ``{` `            ``// Swap i, j``            ``i = i + j;``            ``j = i - j;``            ``i = i - j;` `            ``// swap Fi, Fj``            ``Fi = Fi + Fj;``            ``Fj = Fi - Fj;``            ``Fi = Fi - Fj;``        ``}` `        ``// Find the value of F(i + 1)``        ``// from F(i) and F(j)``        ``int` `Fi1 = (Fj - fibonacci(j - i - 1) * Fi) /``                        ``fibonacci(j - i);` `        ``// When n is equal to i``        ``int` `Fn = 0;``        ``if` `(n == i)``            ``Fn = Fi;` `        ``// When n is greater than i``        ``else` `if` `(n > i)``        ``{``            ``int` `b = Fi;``            ``Fn = Fi1;``            ``n = n - 1;``            ``while` `(n != i)``            ``{``                ``n = n - 1;``                ``int` `a = b;``                ``b = Fn;``                ``Fn = a + b;``            ``}``        ``}` `        ``// When n is smaller than i``        ``else``        ``{``            ``int` `a = Fi;``            ``int` `b = Fi1;``            ``while` `(n != i)``            ``{``                ``n = n + 1;``                ``Fn = b - a;``                ``b = a;``                ``a = Fn;``            ``}``        ``}``        ``return` `Fn;``    ``}` `    ``// Driver Code``    ``public` `static` `void` `Main(String[] args)``    ``{``        ``int` `i = 3;``        ``int` `Fi = 5;``        ``int` `j = -1;``        ``int` `Fj = 4;``        ``int` `n = 5;``        ``Console.WriteLine(determineFn(i, Fi, j, Fj, n));``    ``}``}` `// This code is contributed by Rajput-Ji`

## Javascript

 ``
Output:
`12`

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up