The Fibonacci numbers are the numbers in the following integer sequence.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ……..

In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation

    Fn = Fn-1 + Fn-2

with seed values

F0 = 0 and F1 = 1.

Write a function int fib(int n) that returns Fn. For example, if n = 0, then fib() should return 0. If n = 1, then it should return 1. For n > 1, it should return Fn-1 + Fn-2

For n = 9
Output:34

Following are different methods to get the nth Fibonacci number.

[ad type=”banner”]

Method 1 ( Space Optimized )

We can optimize the space used in method 2 by storing the previous two numbers only because that is all we need to get the next Fibonacci number in series.

[pastacode lang=”cpp” manual=”%2F%2F%20Fibonacci%20Series%20using%20Space%20Optimized%20Method%0A%23include%3Cstdio.h%3E%0Aint%20fib(int%20n)%0A%7B%0A%20%20int%20a%20%3D%200%2C%20b%20%3D%201%2C%20c%2C%20i%3B%0A%20%20if(%20n%20%3D%3D%200)%0A%20%20%20%20return%20a%3B%0A%20%20for%20(i%20%3D%202%3B%20i%20%3C%3D%20n%3B%20i%2B%2B)%0A%20%20%7B%0A%20%20%20%20%20c%20%3D%20a%20%2B%20b%3B%0A%20%20%20%20%20a%20%3D%20b%3B%0A%20%20%20%20%20b%20%3D%20c%3B%0A%20%20%7D%0A%20%20return%20b%3B%0A%7D%0A%20%0Aint%20main%20()%0A%7B%0A%20%20int%20n%20%3D%209%3B%0A%20%20printf(%22%25d%22%2C%20fib(n))%3B%0A%20%20getchar()%3B%0A%20%20return%200%3B%0A%7D” message=”C++” highlight=”” provider=”manual”/]

Time Complexity: O(n)
Extra Space: O(1)

 

[ad type=”banner”]

Method 2 (O(Log n) Time)
Below is one more interesting recurrence formula that can be used to find n’th Fibonacci Number in O(Log n) time.

If n is even then k = n/2:
F(n) = [2*F(k-1) + F(k)]*F(k)

If n is odd then k = (n + 1)/2
F(n) = F(k)*F(k) + F(k-1)*F(k-1)

How does this formula work?
The formula can be derived from above matrix equation.

Fibonacci Series

 

 

Taking determinant on both sides, we get
(-1)n = Fn+1Fn-1 – Fn2
Moreover, since AnAm = An+m for any square matrix A, the following identities can be derived (they are obtained form two different coefficients of the matrix product)

FmFn + Fm-1Fn-1 = Fm+n-1

By putting n = n+1,

FmFn+1 + Fm-1Fn = Fm+n

Putting m = n

F2n-1 = Fn2 + Fn-12

F2n = (Fn-1 + Fn+1)Fn = (2Fn-1 + Fn)Fn (Source: Wiki)

To get the formula to be proved, we simply need to do following
If n is even, we can put k = n/2
If n is odd, we can put k = (n+1)/2

[ad type=”banner”]

Below is C++ implementation of above idea.

[pastacode lang=”cpp” manual=”%2F%2F%20C%2B%2B%20Program%20to%20find%20n’th%20fibonacci%20Number%20in%0A%2F%2F%20with%20O(Log%20n)%20arithmatic%20operations%0A%23include%20%3Cbits%2Fstdc%2B%2B.h%3E%0Ausing%20namespace%20std%3B%0A%20%0Aconst%20int%20MAX%20%3D%201000%3B%0A%20%0A%2F%2F%20Create%20an%20array%20for%20memoization%0Aint%20f%5BMAX%5D%20%3D%20%7B0%7D%3B%0A%20%0A%2F%2F%20Returns%20n’th%20fuibonacci%20number%20using%20table%20f%5B%5D%0Aint%20fib(int%20n)%0A%7B%0A%20%20%20%20%2F%2F%20Base%20cases%0A%20%20%20%20if%20(n%20%3D%3D%200)%0A%20%20%20%20%20%20%20%20return%200%3B%0A%20%20%20%20if%20(n%20%3D%3D%201%20%7C%7C%20n%20%3D%3D%202)%0A%20%20%20%20%20%20%20%20return%20(f%5Bn%5D%20%3D%201)%3B%0A%20%0A%20%20%20%20%2F%2F%20If%20fib(n)%20is%20already%20computed%0A%20%20%20%20if%20(f%5Bn%5D)%0A%20%20%20%20%20%20%20%20return%20f%5Bn%5D%3B%0A%20%0A%20%20%20%20int%20k%20%3D%20(n%20%26%201)%3F%20(n%2B1)%2F2%20%3A%20n%2F2%3B%0A%20%0A%20%20%20%20%2F%2F%20Applyting%20above%20formula%20%5BNote%20value%20n%261%20is%201%0A%20%20%20%20%2F%2F%20if%20n%20is%20odd%2C%20else%200.%0A%20%20%20%20f%5Bn%5D%20%3D%20(n%20%26%201)%3F%20(fib(k)*fib(k)%20%2B%20fib(k-1)*fib(k-1))%0A%20%20%20%20%20%20%20%20%20%20%20%3A%20(2*fib(k-1)%20%2B%20fib(k))*fib(k)%3B%0A%20%0A%20%20%20%20return%20f%5Bn%5D%3B%0A%7D%0A%20%0A%2F*%20Driver%20program%20to%20test%20above%20function%20*%2F%0Aint%20main()%0A%7B%0A%20%20%20%20int%20n%20%3D%209%3B%0A%20%20%20%20printf(%22%25d%20%22%2C%20fib(n))%3B%0A%20%20%20%20return%200%3B%0A%7D” message=”C++” highlight=”” provider=”manual”/]

Output :

34

Time complexity of this solution is O(Log n) as we divide the problem to half in every recursive call.

[ad type=”banner”]