Given a Number N
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.
Given a number n, print n-th Fibonacci Number.
Examples:
Input : n = 2 Output : 1 Input : n = 9 Output : 34
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.
Method 1 (Use recursion)
A simple method that is a direct recursive implementation mathematical recurrence relation is given above.
C++
#include<bits/stdc++.h>
using
namespace
std;
int
fib(
int
n)
{
if
(n <= 1)
return
n;
return
fib(n-1) + fib(n-2);
}
int
main ()
{
int
n = 9;
cout << fib(n);
getchar
();
return
0;
}
C
#include<stdio.h>
int
fib(
int
n)
{
if
(n <= 1)
return
n;
return
fib(n-1) + fib(n-2);
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(n));
getchar
();
return
0;
}
Java
class
fibonacci
{
static
int
fib(
int
n)
{
if
(n <=
1
)
return
n;
return
fib(n-
1
) + fib(n-
2
);
}
public
static
void
main (String args[])
{
int
n =
9
;
System.out.println(fib(n));
}
}
Python3
def
fibonacci(n, second_last, last):
if
n
-
1
=
=
0
:
return
second_last
else
:
new_last
=
second_last
+
last
second_last
=
last
return
fibonacci(n
-
1
, second_last, new_last)
if
__name__
=
=
"__main__"
:
print
(fibonacci(
10
,
0
,
1
))
C#
using
System;
public
class
GFG
{
public
static
int
Fib(
int
n)
{
if
(n <= 1)
{
return
n;
}
else
{
return
Fib(n - 1) + Fib(n - 2);
}
}
public
static
void
Main(
string
[] args)
{
int
n = 9;
Console.Write(Fib(n));
}
}
PHP
<?php
function
fib(
$n
)
{
if
(
$n
<= 1)
return
$n
;
return
fib(
$n
- 1) +
fib(
$n
- 2);
}
$n
= 9;
echo
fib(
$n
);
?>
Javascript
<script>
let n = 9;
function
fib(n) {
if
(n <= 1)
return
n;
return
fib(n-1) + fib(n-2);
}
document.write(fib(n));
</script>
Time Complexity: Exponential, as every function calls two other functions.
If the original recursion tree were to be implemented then this would have been the tree but now for n times the recursion function is called
Original tree for recursion
fib(5) / \ fib(4) fib(3) / \ / \ fib(3) fib(2) fib(2) fib(1) / \ / \ / \ fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) / \ fib(1) fib(0)
Optimized tree for recursion for code above
fib(5)
fib(4)
fib(3)
fib(2)
fib(1)
Extra Space: O(n) if we consider the function call stack size, otherwise O(1).
Method 2 (Use Dynamic Programming)
We can avoid the repeated work done in method 1 by storing the Fibonacci numbers calculated so far.
C++
#include<bits/stdc++.h>
using
namespace
std;
class
GFG{
public
:
int
fib(
int
n)
{
int
f[n + 2];
int
i;
f[0] = 0;
f[1] = 1;
for
(i = 2; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
return
f[n];
}
};
int
main ()
{
GFG g;
int
n = 9;
cout << g.fib(n);
return
0;
}
C
#include<stdio.h>
int
fib(
int
n)
{
int
f[n+2];
int
i;
f[0] = 0;
f[1] = 1;
for
(i = 2; i <= n; i++)
{
f[i] = f[i-1] + f[i-2];
}
return
f[n];
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(n));
getchar
();
return
0;
}
Java
class
fibonacci
{
static
int
fib(
int
n)
{
int
f[] =
new
int
[n+
2
];
int
i;
f[
0
] =
0
;
f[
1
] =
1
;
for
(i =
2
; i <= n; i++)
{
f[i] = f[i-
1
] + f[i-
2
];
}
return
f[n];
}
public
static
void
main (String args[])
{
int
n =
9
;
System.out.println(fib(n));
}
}
Python3
def
fibonacci(n):
f
=
[
0
,
1
]
for
i
in
range
(
2
, n
+
1
):
f.append(f[i
-
1
]
+
f[i
-
2
])
return
f[n]
print
(fibonacci(
9
))
C#
using
System;
class
fibonacci {
static
int
fib(
int
n)
{
int
[]f =
new
int
[n + 2];
int
i;
f[0] = 0;
f[1] = 1;
for
(i = 2; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
return
f[n];
}
public
static
void
Main ()
{
int
n = 9;
Console.WriteLine(fib(n));
}
}
PHP
<?php
function
fib(
$n
)
{
$f
=
array
();
$i
;
$f
[0] = 0;
$f
[1] = 1;
for
(
$i
= 2;
$i
<=
$n
;
$i
++)
{
$f
[
$i
] =
$f
[
$i
-1] +
$f
[
$i
-2];
}
return
$f
[
$n
];
}
$n
= 9;
echo
fib(
$n
);
?>
Javascript
<script>
function
fib(n)
{
let f =
new
Array(n+2);
let i;
f[0] = 0;
f[1] = 1;
for
(i = 2; i <= n; i++)
{
f[i] = f[i-1] + f[i-2];
}
return
f[n];
}
let n=9;
document.write(fib(n));
</script>
Method 3 (Space Optimized Method 2)
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.
C++
#include<bits/stdc++.h>
using
namespace
std;
int
fib(
int
n)
{
int
a = 0, b = 1, c, i;
if
( n == 0)
return
a;
for
(i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
int
main()
{
int
n = 9;
cout << fib(n);
return
0;
}
C
#include<stdio.h>
int
fib(
int
n)
{
int
a = 0, b = 1, c, i;
if
( n == 0)
return
a;
for
(i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(n));
getchar
();
return
0;
}
Java
class
fibonacci
{
static
int
fib(
int
n)
{
int
a =
0
, b =
1
, c;
if
(n ==
0
)
return
a;
for
(
int
i =
2
; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
public
static
void
main (String args[])
{
int
n =
9
;
System.out.println(fib(n));
}
}
Python3
def
fibonacci(n):
a
=
0
b
=
1
if
n <
0
:
print
(
"Incorrect input"
)
elif
n
=
=
0
:
return
a
elif
n
=
=
1
:
return
b
else
:
for
i
in
range
(
2
,n
+
1
):
c
=
a
+
b
a
=
b
b
=
c
return
b
print
(fibonacci(
9
))
C#
using
System;
namespace
Fib
{
public
class
GFG
{
static
int
Fib(
int
n)
{
int
a = 0, b = 1, c = 0;
if
(n == 0)
return
a;
for
(
int
i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
public
static
void
Main(
string
[] args)
{
int
n = 9;
Console.Write(
"{0} "
, Fib(n));
}
}
}
PHP
<?php
function
fib(
$n
)
{
$a
= 0;
$b
= 1;
$c
;
$i
;
if
(
$n
== 0)
return
$a
;
for
(
$i
= 2;
$i
<=
$n
;
$i
++)
{
$c
=
$a
+
$b
;
$a
=
$b
;
$b
=
$c
;
}
return
$b
;
}
$n
= 9;
echo
fib(
$n
);
?>
Javascript
<script>
function
fib(n)
{
let a = 0, b = 1, c, i;
if
( n == 0)
return
a;
for
(i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
let n = 9;
document.write(fib(n));
</script>
Time Complexity: O(n)
Extra Space: O(1)
Method 4 (Using power of the matrix {{1, 1}, {1, 0}})
This another O(n) which relies on the fact that if we n times multiply the matrix M = {{1,1},{1,0}} to itself (in other words calculate power(M, n)), then we get the (n+1)th Fibonacci number as the element at row and column (0, 0) in the resultant matrix.
The matrix representation gives the following closed expression for the Fibonacci numbers:
C++
#include<bits/stdc++.h>
using
namespace
std;
void
multiply(
int
F[2][2],
int
M[2][2]);
void
power(
int
F[2][2],
int
n);
int
fib(
int
n)
{
int
F[2][2] = { { 1, 1 }, { 1, 0 } };
if
(n == 0)
return
0;
power(F, n - 1);
return
F[0][0];
}
void
multiply(
int
F[2][2],
int
M[2][2])
{
int
x = F[0][0] * M[0][0] +
F[0][1] * M[1][0];
int
y = F[0][0] * M[0][1] +
F[0][1] * M[1][1];
int
z = F[1][0] * M[0][0] +
F[1][1] * M[1][0];
int
w = F[1][0] * M[0][1] +
F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
void
power(
int
F[2][2],
int
n)
{
int
i;
int
M[2][2] = { { 1, 1 }, { 1, 0 } };
for
(i = 2; i <= n; i++)
multiply(F, M);
}
int
main()
{
int
n = 9;
cout <<
" "
<< fib(n);
return
0;
}
C
#include <stdio.h>
void
multiply(
int
F[2][2],
int
M[2][2]);
void
power(
int
F[2][2],
int
n);
int
fib(
int
n)
{
int
F[2][2] = {{1,1},{1,0}};
if
(n == 0)
return
0;
power(F, n-1);
return
F[0][0];
}
void
multiply(
int
F[2][2],
int
M[2][2])
{
int
x = F[0][0]*M[0][0] + F[0][1]*M[1][0];
int
y = F[0][0]*M[0][1] + F[0][1]*M[1][1];
int
z = F[1][0]*M[0][0] + F[1][1]*M[1][0];
int
w = F[1][0]*M[0][1] + F[1][1]*M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
void
power(
int
F[2][2],
int
n)
{
int
i;
int
M[2][2] = {{1,1},{1,0}};
for
(i = 2; i <= n; i++)
multiply(F, M);
}
int
main()
{
int
n = 9;
printf
(
"%d"
, fib(n));
getchar
();
return
0;
}
Java
class
fibonacci
{
static
int
fib(
int
n)
{
int
F[][] =
new
int
[][]{{
1
,
1
},{
1
,
0
}};
if
(n ==
0
)
return
0
;
power(F, n-
1
);
return
F[
0
][
0
];
}
static
void
multiply(
int
F[][],
int
M[][])
{
int
x = F[
0
][
0
]*M[
0
][
0
] + F[
0
][
1
]*M[
1
][
0
];
int
y = F[
0
][
0
]*M[
0
][
1
] + F[
0
][
1
]*M[
1
][
1
];
int
z = F[
1
][
0
]*M[
0
][
0
] + F[
1
][
1
]*M[
1
][
0
];
int
w = F[
1
][
0
]*M[
0
][
1
] + F[
1
][
1
]*M[
1
][
1
];
F[
0
][
0
] = x;
F[
0
][
1
] = y;
F[
1
][
0
] = z;
F[
1
][
1
] = w;
}
static
void
power(
int
F[][],
int
n)
{
int
i;
int
M[][] =
new
int
[][]{{
1
,
1
},{
1
,
0
}};
for
(i =
2
; i <= n; i++)
multiply(F, M);
}
public
static
void
main (String args[])
{
int
n =
9
;
System.out.println(fib(n));
}
}
Python3
def
fib(n):
F
=
[[
1
,
1
],
[
1
,
0
]]
if
(n
=
=
0
):
return
0
power(F, n
-
1
)
return
F[
0
][
0
]
def
multiply(F, M):
x
=
(F[
0
][
0
]
*
M[
0
][
0
]
+
F[
0
][
1
]
*
M[
1
][
0
])
y
=
(F[
0
][
0
]
*
M[
0
][
1
]
+
F[
0
][
1
]
*
M[
1
][
1
])
z
=
(F[
1
][
0
]
*
M[
0
][
0
]
+
F[
1
][
1
]
*
M[
1
][
0
])
w
=
(F[
1
][
0
]
*
M[
0
][
1
]
+
F[
1
][
1
]
*
M[
1
][
1
])
F[
0
][
0
]
=
x
F[
0
][
1
]
=
y
F[
1
][
0
]
=
z
F[
1
][
1
]
=
w
def
power(F, n):
M
=
[[
1
,
1
],
[
1
,
0
]]
for
i
in
range
(
2
, n
+
1
):
multiply(F, M)
if
__name__
=
=
"__main__"
:
n
=
9
print
(fib(n))
C#
using
System;
class
GFG {
static
int
fib(
int
n)
{
int
[,]F =
new
int
[,] {{1, 1},
{1, 0} };
if
(n == 0)
return
0;
power(F, n-1);
return
F[0,0];
}
static
void
multiply(
int
[,]F,
int
[,]M)
{
int
x = F[0,0]*M[0,0] + F[0,1]*M[1,0];
int
y = F[0,0]*M[0,1] + F[0,1]*M[1,1];
int
z = F[1,0]*M[0,0] + F[1,1]*M[1,0];
int
w = F[1,0]*M[0,1] + F[1,1]*M[1,1];
F[0,0] = x;
F[0,1] = y;
F[1,0] = z;
F[1,1] = w;
}
static
void
power(
int
[,]F,
int
n)
{
int
i;
int
[,]M =
new
int
[,]{{1, 1},
{1, 0} };
for
(i = 2; i <= n; i++)
multiply(F, M);
}
public
static
void
Main ()
{
int
n = 9;
Console.WriteLine(fib(n));
}
}
PHP
<?php
function
fib(
$n
)
{
$F
=
array
(
array
(1, 1),
array
(1, 0));
if
(
$n
== 0)
return
0;
power(
$F
,
$n
- 1);
return
$F
[0][0];
}
function
multiply(&
$F
, &
$M
)
{
$x
=
$F
[0][0] *
$M
[0][0] +
$F
[0][1] *
$M
[1][0];
$y
=
$F
[0][0] *
$M
[0][1] +
$F
[0][1] *
$M
[1][1];
$z
=
$F
[1][0] *
$M
[0][0] +
$F
[1][1] *
$M
[1][0];
$w
=
$F
[1][0] *
$M
[0][1] +
$F
[1][1] *
$M
[1][1];
$F
[0][0] =
$x
;
$F
[0][1] =
$y
;
$F
[1][0] =
$z
;
$F
[1][1] =
$w
;
}
function
power(&
$F
,
$n
)
{
$M
=
array
(
array
(1, 1),
array
(1, 0));
for
(
$i
= 2;
$i
<=
$n
;
$i
++)
multiply(
$F
,
$M
);
}
$n
= 9;
echo
fib(
$n
);
?>
Javascript
<script>
function
fib( n)
{
var
F = [ [ 1, 1 ], [ 1, 0 ] ];
if
(n == 0)
return
0;
power(F, n - 1);
return
F[0][0];
}
function
multiply( F, M )
{
x = F[0][0] * M[0][0] +
F[0][1] * M[1][0];
y = F[0][0] * M[0][1] +
F[0][1] * M[1][1];
z = F[1][0] * M[0][0] +
F[1][1] * M[1][0];
w = F[1][0] * M[0][1] +
F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
function
power( F, n)
{
var
i;
var
M = [[ 1, 1 ], [ 1, 0 ]];
for
(i = 2; i <= n; i++)
multiply(F, M);
}
var
n = 9;
document.write (
" "
+ fib(n));
</script>
Time Complexity: O(n)
Extra Space: O(1)
Method 5 (Optimized Method 4)
The method 4 can be optimized to work in O(Logn) time complexity. We can do recursive multiplication to get power(M, n) in the previous method (Similar to the optimization done in this post)
C++
#include <bits/stdc++.h>
using
namespace
std;
void
multiply(
int
F[2][2],
int
M[2][2]);
void
power(
int
F[2][2],
int
n);
int
fib(
int
n)
{
int
F[2][2] = {{1, 1}, {1, 0}};
if
(n == 0)
return
0;
power(F, n - 1);
return
F[0][0];
}
void
power(
int
F[2][2],
int
n)
{
if
(n == 0 || n == 1)
return
;
int
M[2][2] = {{1, 1}, {1, 0}};
power(F, n / 2);
multiply(F, F);
if
(n % 2 != 0)
multiply(F, M);
}
void
multiply(
int
F[2][2],
int
M[2][2])
{
int
x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
int
y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
int
z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
int
w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
int
main()
{
int
n = 9;
cout << fib(9);
getchar
();
return
0;
}
C
#include <stdio.h>
void
multiply(
int
F[2][2],
int
M[2][2]);
void
power(
int
F[2][2],
int
n);
int
fib(
int
n)
{
int
F[2][2] = {{1,1},{1,0}};
if
(n == 0)
return
0;
power(F, n-1);
return
F[0][0];
}
void
power(
int
F[2][2],
int
n)
{
if
( n == 0 || n == 1)
return
;
int
M[2][2] = {{1,1},{1,0}};
power(F, n/2);
multiply(F, F);
if
(n%2 != 0)
multiply(F, M);
}
void
multiply(
int
F[2][2],
int
M[2][2])
{
int
x = F[0][0]*M[0][0] + F[0][1]*M[1][0];
int
y = F[0][0]*M[0][1] + F[0][1]*M[1][1];
int
z = F[1][0]*M[0][0] + F[1][1]*M[1][0];
int
w = F[1][0]*M[0][1] + F[1][1]*M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
int
main()
{
int
n = 9;
printf
(
"%d"
, fib(9));
getchar
();
return
0;
}
Java
class
fibonacci
{
static
int
fib(
int
n)
{
int
F[][] =
new
int
[][]{{
1
,
1
},{
1
,
0
}};
if
(n ==
0
)
return
0
;
power(F, n-
1
);
return
F[
0
][
0
];
}
static
void
multiply(
int
F[][],
int
M[][])
{
int
x = F[
0
][
0
]*M[
0
][
0
] + F[
0
][
1
]*M[
1
][
0
];
int
y = F[
0
][
0
]*M[
0
][
1
] + F[
0
][
1
]*M[
1
][
1
];
int
z = F[
1
][
0
]*M[
0
][
0
] + F[
1
][
1
]*M[
1
][
0
];
int
w = F[
1
][
0
]*M[
0
][
1
] + F[
1
][
1
]*M[
1
][
1
];
F[
0
][
0
] = x;
F[
0
][
1
] = y;
F[
1
][
0
] = z;
F[
1
][
1
] = w;
}
static
void
power(
int
F[][],
int
n)
{
if
( n ==
0
|| n ==
1
)
return
;
int
M[][] =
new
int
[][]{{
1
,
1
},{
1
,
0
}};
power(F, n/
2
);
multiply(F, F);
if
(n%
2
!=
0
)
multiply(F, M);
}
public
static
void
main (String args[])
{
int
n =
9
;
System.out.println(fib(n));
}
}
Python3
def
fib(n):
F
=
[[
1
,
1
],
[
1
,
0
]]
if
(n
=
=
0
):
return
0
power(F, n
-
1
)
return
F[
0
][
0
]
def
multiply(F, M):
x
=
(F[
0
][
0
]
*
M[
0
][
0
]
+
F[
0
][
1
]
*
M[
1
][
0
])
y
=
(F[
0
][
0
]
*
M[
0
][
1
]
+
F[
0
][
1
]
*
M[
1
][
1
])
z
=
(F[
1
][
0
]
*
M[
0
][
0
]
+
F[
1
][
1
]
*
M[
1
][
0
])
w
=
(F[
1
][
0
]
*
M[
0
][
1
]
+
F[
1
][
1
]
*
M[
1
][
1
])
F[
0
][
0
]
=
x
F[
0
][
1
]
=
y
F[
1
][
0
]
=
z
F[
1
][
1
]
=
w
def
power(F, n):
if
( n
=
=
0
or
n
=
=
1
):
return
;
M
=
[[
1
,
1
],
[
1
,
0
]];
power(F, n
/
/
2
)
multiply(F, F)
if
(n
%
2
!
=
0
):
multiply(F, M)
if
__name__
=
=
"__main__"
:
n
=
9
print
(fib(n))
C#
using
System;
class
GFG
{
static
int
fib(
int
n)
{
int
[,] F =
new
int
[,]{{1, 1},
{1, 0}};
if
(n == 0)
return
0;
power(F, n - 1);
return
F[0, 0];
}
static
void
multiply(
int
[,] F,
int
[,] M)
{
int
x = F[0, 0] * M[0, 0] +
F[0, 1] * M[1, 0];
int
y = F[0, 0] * M[0, 1] +
F[0, 1] * M[1, 1];
int
z = F[1, 0] * M[0, 0] +
F[1, 1] * M[1, 0];
int
w = F[1, 0] * M[0, 1] +
F[1, 1] * M[1, 1];
F[0, 0] = x;
F[0, 1] = y;
F[1, 0] = z;
F[1, 1] = w;
}
static
void
power(
int
[,] F,
int
n)
{
if
( n == 0 || n == 1)
return
;
int
[,] M =
new
int
[,]{{1, 1},
{1, 0}};
power(F, n / 2);
multiply(F, F);
if
(n % 2 != 0)
multiply(F, M);
}
public
static
void
Main ()
{
int
n = 9;
Console.Write(fib(n));
}
}
Javascript
<script>
function
fib(n)
{
var
F = [ [ 1, 1 ], [ 1, 0 ] ];
if
(n == 0)
return
0;
power(F, n - 1);
return
F[0][0];
}
function
multiply(F, M)
{
var
x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
var
y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
var
z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
var
w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
function
power(F, n)
{
if
(n == 0 || n == 1)
return
;
var
M = [ [ 1, 1 ], [ 1, 0 ] ];
power(F, n / 2);
multiply(F, F);
if
(n % 2 != 0)
multiply(F, M);
}
var
n = 9;
document.write(fib(n));
</script>
Time Complexity: O(Logn)
Extra Space: O(Logn) if we consider the function call stack size, otherwise O(1).
Method 6 (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.
Taking determinant on both sides, we get (-1)n = Fn+1Fn-1 - Fn 2 Moreover, since AnAm = An+m for any square matrix A, the following identities can be derived (they are obtained from two different coefficients of the matrix product) FmFn + Fm-1Fn-1 = Fm+n-1 ---------------------------(1) By putting n = n+1 in equation(1), FmFn+1 + Fm-1Fn = Fm+n --------------------------(2) Putting m = n in equation(1). F2n-1 = Fn 2 + Fn-1 2 Putting m = n in equation(2) F2n = (Fn-1 + Fn+1)Fn = (2Fn-1 + Fn)Fn (Source: Wiki) -------- ( By putting Fn+1 = Fn + Fn-1 ) To get the formula to be proved, we simply need to do the following If n is even, we can put k = n/2 If n is odd, we can put k = (n+1)/2
Below is the implementation of above idea.
C++
#include <bits/stdc++.h>
using
namespace
std;
const
int
MAX = 1000;
int
f[MAX] = {0};
int
fib(
int
n)
{
if
(n == 0)
return
0;
if
(n == 1 || n == 2)
return
(f[n] = 1);
if
(f[n])
return
f[n];
int
k = (n & 1)? (n+1)/2 : n/2;
f[n] = (n & 1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1))
: (2*fib(k-1) + fib(k))*fib(k);
return
f[n];
}
int
main()
{
int
n = 9;
printf
(
"%d "
, fib(n));
return
0;
}
Java
import
java.util.*;
class
GFG {
static
int
MAX =
1000
;
static
int
f[];
public
static
int
fib(
int
n)
{
if
(n ==
0
)
return
0
;
if
(n ==
1
|| n ==
2
)
return
(f[n] =
1
);
if
(f[n] !=
0
)
return
f[n];
int
k = (n &
1
) ==
1
? (n +
1
) /
2
: n /
2
;
f[n] = (n &
1
) ==
1
? (fib(k) * fib(k) +
fib(k -
1
) * fib(k -
1
))
: (
2
* fib(k -
1
) + fib(k))
* fib(k);
return
f[n];
}
public
static
void
main(String[] args)
{
int
n =
9
;
f=
new
int
[MAX];
System.out.println(fib(n));
}
}
Python3
MAX
=
1000
f
=
[
0
]
*
MAX
def
fib(n) :
if
(n
=
=
0
) :
return
0
if
(n
=
=
1
or
n
=
=
2
) :
f[n]
=
1
return
(f[n])
if
(f[n]) :
return
f[n]
if
( n &
1
) :
k
=
(n
+
1
)
/
/
2
else
:
k
=
n
/
/
2
if
((n &
1
) ) :
f[n]
=
(fib(k)
*
fib(k)
+
fib(k
-
1
)
*
fib(k
-
1
))
else
:
f[n]
=
(
2
*
fib(k
-
1
)
+
fib(k))
*
fib(k)
return
f[n]
n
=
9
print
(fib(n))
C#
using
System;
class
GFG
{
static
int
MAX = 1000;
static
int
[] f;
public
static
int
fib(
int
n)
{
if
(n == 0)
return
0;
if
(n == 1 || n == 2)
return
(f[n] = 1);
if
(f[n] != 0)
return
f[n];
int
k = (n & 1) == 1 ? (n + 1) / 2
: n / 2;
f[n] = (n & 1) == 1 ? (fib(k) * fib(k) +
fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) *
fib(k);
return
f[n];
}
static
void
Main()
{
int
n = 9;
f =
new
int
[MAX];
Console.WriteLine(fib(n));
}
}
PHP
<?php
$MAX
= 1000;
function
fib(
$n
)
{
global
$MAX
;
$f
=
array_fill
(0,
$MAX
, NULL);
if
(
$n
== 0)
return
0;
if
(
$n
== 1 ||
$n
== 2)
return
(
$f
[
$n
] = 1);
if
(
$f
[
$n
])
return
$f
[
$n
];
$k
= (
$n
& 1) ? (
$n
+ 1) / 2 :
$n
/ 2;
$f
[
$n
] = (
$n
& 1) ? (fib(
$k
) * fib(
$k
) +
fib(
$k
- 1) * fib(
$k
- 1)) :
(2 * fib(
$k
- 1) + fib(
$k
)) * fib(
$k
);
return
$f
[
$n
];
}
$n
= 9;
echo
fib(
$n
);
?>
Javascript
<script>
const MAX = 1000;
var
f = [...Array(MAX)];
f.fill(0);
function
fib(n) {
if
(n == 0)
return
0;
if
(n == 1 || n == 2)
return
(f[n] = 1);
if
(f[n])
return
f[n];
var
k = n & 1 ? (n + 1) / 2 : n / 2;
f[n] =
n & 1
? fib(k) * fib(k) + fib(k - 1) * fib(k - 1)
: (2 * fib(k - 1) + fib(k)) * fib(k);
return
f[n];
}
var
n = 9;
document.write(fib(n));
</script>
Time complexity of this solution is O(Log n) as we divide the problem to half in every recursive call.
Method 7
Another approach(Using formula) :
In this method we directly implement the formula for nth term in the fibonacci series.
Fn = {[(√5 + 1)/2] ^ n} / √5
Reference: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html
C++
#include<iostream>
#include<cmath>
int
fib(
int
n) {
double
phi = (1 +
sqrt
(5)) / 2;
return
round(
pow
(phi, n) /
sqrt
(5));
}
int
main ()
{
int
n = 9;
std::cout << fib(n) << std::endl;
return
0;
}
C
#include<stdio.h>
#include<math.h>
int
fib(
int
n) {
double
phi = (1 +
sqrt
(5)) / 2;
return
round(
pow
(phi, n) /
sqrt
(5));
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(n));
return
0;
}
Java
import
java.util.*;
class
GFG {
static
int
fib(
int
n) {
double
phi = (
1
+ Math.sqrt(
5
)) /
2
;
return
(
int
) Math.round(Math.pow(phi, n)
/ Math.sqrt(
5
));
}
public
static
void
main(String[] args) {
int
n =
9
;
System.out.println(fib(n));
}
}
Python3
import
math
def
fibo(n):
phi
=
(
1
+
math.sqrt(
5
))
/
2
return
round
(
pow
(phi, n)
/
math.sqrt(
5
))
if
__name__
=
=
'__main__'
:
n
=
9
print
(fibo(n))
C#
using
System;
public
class
GFG
{
static
int
fib(
int
n)
{
double
phi = (1 + Math.Sqrt(5)) / 2;
return
(
int
) Math.Round(Math.Pow(phi, n)
/ Math.Sqrt(5));
}
public
static
void
Main()
{
int
n = 9;
Console.WriteLine(fib(n));
}
}
PHP
<?php
function
fib(
$n
)
{
$phi
= (1 + sqrt(5)) / 2;
return
round
(pow(
$phi
,
$n
) / sqrt(5));
}
$n
= 9;
echo
fib(
$n
) ;
?>
Javascript
<script>
function
fib(n) {
let phi = (1 + Math.sqrt(5)) / 2;
return
Math.round(Math.pow(phi, n) / Math.sqrt(5));
}
let n = 9;
document.write(fib(n));
</script>
Time Complexity: O(logn), this is because calculating phi^n takes logn time
Space Complexity: O(1)
Method 8
DP using memoization(Top down approach)
We can avoid the repeated work done in method 1 by storing the Fibonacci numbers calculated so far. We just need to store all the values in an array.
C++
#include <bits/stdc++.h>
using
namespace
std;
int
dp[10];
int
fib(
int
n)
{
if
(n <= 1)
return
n;
int
first, second;
if
(dp[n - 1] != -1)
first = dp[n - 1];
else
first = fib(n - 1);
if
(dp[n - 2] != -1)
second = dp[n - 2];
else
second = fib(n - 2);
return
dp[n] = first + second;
}
int
main()
{
int
n = 9;
memset
(dp, -1,
sizeof
(dp));
cout << fib(n);
getchar
();
return
0;
}
Java
import
java.util.*;
class
GFG{
static
int
[] dp =
new
int
[
10
];
static
int
fib(
int
n)
{
if
(n <=
1
)
return
n;
int
first, second;
if
(dp[n -
1
] != -
1
)
first = dp[n -
1
];
else
first = fib(n -
1
);
if
(dp[n -
2
] != -
1
)
second = dp[n -
2
];
else
second = fib(n -
2
);
return
dp[n] = first + second;
}
public
static
void
main(String[] args)
{
int
n =
9
;
Arrays.fill(dp, -
1
);
System.out.print(fib(n));
}
}
Python3
dp
=
[
-
1
for
i
in
range
(
10
)]
def
fib(n):
if
(n <
=
1
):
return
n;
global
dp;
first
=
0
;
second
=
0
;
if
(dp[n
-
1
] !
=
-
1
):
first
=
dp[n
-
1
];
else
:
first
=
fib(n
-
1
);
if
(dp[n
-
2
] !
=
-
1
):
second
=
dp[n
-
2
];
else
:
second
=
fib(n
-
2
);
dp[n]
=
first
+
second;
return
dp[n] ;
if
__name__
=
=
'__main__'
:
n
=
9
;
print
(fib(n));
C#
using
System;
class
GFG {
static
int
[] dp =
new
int
[10];
static
int
fib(
int
n)
{
if
(n <= 1)
return
n;
int
first, second;
if
(dp[n - 1] != -1)
first = dp[n - 1];
else
first = fib(n - 1);
if
(dp[n - 2] != -1)
second = dp[n - 2];
else
second = fib(n - 2);
return
dp[n] = first + second;
}
static
void
Main()
{
int
n = 9;
Array.Fill(dp, -1);
Console.Write(fib(n));
}
}
Javascript
<script>
dp = Array.from({length: 10}, (_, i) => -1);
function
fib(n)
{
if
(n <= 1)
return
n;
var
first, second;
if
(dp[n - 1] != -1)
first = dp[n - 1];
else
first = fib(n - 1);
if
(dp[n - 2] != -1)
second = dp[n - 2];
else
second = fib(n - 2);
return
dp[n] = first + second;
}
var
n = 9;
document.write(fib(n));
</script>
https://www.youtube.com/watch?v=LwZRsM7qhrI
This method is contributed by Chirag Agarwal.
Method 9 ( Using Binet's Formula for the Nth Fibonacci )
It involves the usage of our golden section number Phi.
Phi = ( sqrt(5) + 1 ) / 2
Using approximation equation is good enough here, since we know N >= 0 && N <= 30, we can safely use the following rounded function
Fib(N) = round( ( Phi^N ) / sqrt(5) )
Full mathematical explanation of Binet's Formula – https://r-knott.surrey.ac.uk/Fibonacci/fibFormula.html
C++
#include<bits/stdc++.h>
using
namespace
std;
int
fib(
int
n)
{
double
phi = (
sqrt
(5) + 1) / 2;
return
round(
pow
(phi, n) /
sqrt
(5));
}
int
main()
{
int
n = 9;
cout << fib(n);
return
0;
}
Time Complexity: O(1)
Space Complexity: O(1)
Related Articles:
Large Fibonacci Numbers in Java
Please write comments if you find the above codes/algorithms incorrect, or find other ways to solve the same problem.
References:
http://en.wikipedia.org/wiki/Fibonacci_number
http://www.ics.uci.edu/~eppstein/161/960109.html
Source: https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
0 Response to "Given a Number N"
Post a Comment