5 8 13 21 34
The Fibonacci numbers are the numbers in the following integer sequence.
0, 1, 1, 2, 3, 5, viii, xiii, 21, 34, 55, 89, 144, ……..
In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation
Fnorthward = Fn-1 + Fn-two
with seed values
F0 = 0 and F1 = 1.
Given a number n, print n-th Fibonacci Number.
Examples:
Input : n = 2 Output : ane Input : n = 9 Output : 34
Write a function int fib(int northward) that returns Fdue north. For instance, if n = 0, then fib() should return 0. If n = 1, then it should return ane. For n > ane, it should render Fn-ane + Fnorth-2
For north = 9 Output:34
The following are different methods to become the nth Fibonacci number.
Method one (Use recursion)
A simple method that is a straight recursive implementation mathematical recurrence relation is given above.
C++
#include <bits/stdc++.h>
using
namespace
std;
int
fib(
int
n)
{
if
(n <= one)
render
due north;
render
fib(n - 1) + fib(n - 2);
}
int
main()
{
int
north = 9;
cout << fib(n);
getchar
();
return
0;
}
C
#include <stdio.h>
int
fib(
int
northward)
{
if
(n <= 1)
return
n;
return
fib(north - i) + fib(n - 2);
}
int
main()
{
int
due north = 9;
printf
(
"%d"
, fib(north));
getchar
();
render
0;
}
Java
class
fibonacci {
static
int
fib(
int
n)
{
if
(north <=
i
)
return
north;
return
fib(n -
1
) + fib(due north -
ii
);
}
public
static
void
main(String args[])
{
int
northward =
9
;
Organisation.out.println(fib(due north));
}
}
Python3
def
fibonacci(northward):
if
northward <
=
1
:
return
n
render
fibonacci(n
-
1
)
+
fibonacci(northward
-
ii
)
if
__name__
=
=
"__main__"
:
n
=
9
print
(fibonacci(n))
C#
using
System;
public
class
GFG
{
public
static
int
Fib(
int
due north)
{
if
(n <= ane)
{
render
n;
}
else
{
return
Fib(n - 1) + Fib(n - 2);
}
}
public
static
void
Main(
string
[] args)
{
int
north = ix;
Console.Write(Fib(northward));
}
}
PHP
<?php
function
fib(
$n
)
{
if
(
$n
<= 1)
return
$n
;
return
fib(
$n
- 1) +
fib(
$n
- 2);
}
$n
= nine;
echo
fib(
$n
);
?>
Javascript
<script>
permit n = 9;
function
fib(north) {
if
(n <= one)
return
north;
render
fib(due north-1) + fib(n-2);
}
certificate.write(fib(northward));
</script>
Time Complication: Exponential, as every function calls two other functions.
If the original recursion tree were to be implemented then this would take been the tree but now for n times the recursion part is called
Original tree for recursion
fib(5) / \ fib(iv) fib(3) / \ / \ fib(3) fib(ii) fib(two) 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(four)
fib(3)
fib(2)
fib(1)
Extra Space: O(n) if we consider the part call stack size, otherwise O(1).
Method two: (Use Dynamic Programming)
We can avert the repeated work done in method one by storing the Fibonacci numbers calculated and so far.
C++
#include<$.25/stdc++.h>
using
namespace
std;
class
GFG{
public
:
int
fib(
int
northward)
{
int
f[northward + ii];
int
i;
f[0] = 0;
f[1] = i;
for
(i = 2; i <= northward; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
return
f[due north];
}
};
int
main ()
{
GFG thou;
int
n = 9;
cout << g.fib(due north);
return
0;
}
C
#include<stdio.h>
int
fib(
int
north)
{
int
f[northward+two];
int
i;
f[0] = 0;
f[ane] = 1;
for
(i = 2; i <= northward; i++)
{
f[i] = f[i-1] + f[i-two];
}
render
f[n];
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(n));
getchar
();
return
0;
}
Coffee
public
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 <= northward; i++)
{
f[i] = f[i-
1
] + f[i-
ii
];
}
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
, north
+
ane
):
f.append(f[i
-
1
]
+
f[i
-
ii
])
return
f[north]
print
(fibonacci(
9
))
C#
using
System;
class
fibonacci {
static
int
fib(
int
n)
{
int
[]f =
new
int
[n + ii];
int
i;
f[0] = 0;
f[1] = 1;
for
(i = two; i <= n; i++)
{
f[i] = f[i - 1] + f[i - two];
}
return
f[n];
}
public
static
void
Main ()
{
int
n = ix;
Console.WriteLine(fib(northward));
}
}
PHP
<?php
function
fib(
$northward
)
{
$f
=
array
();
$i
;
$f
[0] = 0;
$f
[1] = i;
for
(
$i
= 2;
$i
<=
$due north
;
$i
++)
{
$f
[
$i
] =
$f
[
$i
-one] +
$f
[
$i
-two];
}
return
$f
[
$n
];
}
$n
= 9;
echo
fib(
$northward
);
?>
Javascript
<script>
part
fib(n)
{
allow f =
new
Array(n+two);
let i;
f[0] = 0;
f[i] = one;
for
(i = ii; i <= northward; i++)
{
f[i] = f[i-1] + f[i-2];
}
return
f[north];
}
let northward=9;
certificate.write(fib(n));
</script>
Time complexity: O(n) for given n
Auxiliary space: O(north)
Method 3: (Space Optimized Method ii)
Nosotros tin can optimize the space used in method ii by storing the previous two numbers only because that is all we need to get the next Fibonacci number in series.
C++
#include<$.25/stdc++.h>
using
namespace
std;
int
fib(
int
n)
{
int
a = 0, b = i, c, i;
if
( n == 0)
return
a;
for
(i = 2; i <= due north; 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 = i, c, i;
if
( n == 0)
return
a;
for
(i = 2; i <= due north; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(northward));
getchar
();
return
0;
}
Java
public
form
fibonacci
{
static
int
fib(
int
n)
{
int
a =
0
, b =
ane
, c;
if
(n ==
0
)
render
a;
for
(
int
i =
two
; i <= due north; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
public
static
void
main (Cord args[])
{
int
n =
nine
;
System.out.println(fib(n));
}
};
Python3
def
fibonacci(n):
a
=
0
b
=
1
if
n <
0
:
print
(
"Incorrect input"
)
elif
due north
=
=
0
:
render
a
elif
due north
=
=
1
:
return
b
else
:
for
i
in
range
(
ii
,north
+
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
north)
{
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;
Panel.Write(
"{0} "
, Fib(due north));
}
}
}
PHP
<?php
function
fib(
$n
)
{
$a
= 0;
$b
= 1;
$c
;
$i
;
if
(
$north
== 0)
return
$a
;
for
(
$i
= 2;
$i
<=
$northward
;
$i
++)
{
$c
=
$a
+
$b
;
$a
=
$b
;
$b
=
$c
;
}
render
$b
;
}
$north
= 9;
echo
fib(
$north
);
?>
Javascript
<script>
function
fib(n)
{
let a = 0, b = i, c, i;
if
( n == 0)
return
a;
for
(i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return
b;
}
permit n = 9;
certificate.write(fib(n));
</script>
Fourth dimension Complexity: O(n)
Actress Space: O(ane)
Method 4: Using power of the matrix {{one, one}, {1, 0}}
This is some other O(n) that 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)), and then we become the (n+1)th Fibonacci number as the element at row and cavalcade (0, 0) in the resultant matrix.
The matrix representation gives the following closed expression for the Fibonacci numbers:
C++
#include<$.25/stdc++.h>
using
namespace
std;
void
multiply(
int
F[two][2],
int
M[two][2]);
void
power(
int
F[ii][2],
int
due north);
int
fib(
int
due north)
{
int
F[ii][2] = { { 1, 1 }, { one, 0 } };
if
(n == 0)
render
0;
power(F, north - 1);
return
F[0][0];
}
void
multiply(
int
F[2][2],
int
K[2][2])
{
int
ten = F[0][0] * M[0][0] +
F[0][ane] * M[1][0];
int
y = F[0][0] * M[0][1] +
F[0][1] * M[i][1];
int
z = F[ane][0] * M[0][0] +
F[1][1] * M[1][0];
int
w = F[ane][0] * M[0][1] +
F[1][one] * Chiliad[1][1];
F[0][0] = 10;
F[0][i] = y;
F[1][0] = z;
F[1][i] = westward;
}
void
power(
int
F[two][two],
int
northward)
{
int
i;
int
M[2][2] = { { 1, i }, { 1, 0 } };
for
(i = 2; i <= northward; i++)
multiply(F, 1000);
}
int
main()
{
int
n = 9;
cout <<
" "
<< fib(n);
return
0;
}
C
#include <stdio.h>
void
multiply(
int
F[2][ii],
int
M[two][two]);
void
power(
int
F[two][ii],
int
n);
int
fib(
int
n)
{
int
F[two][2] = {{1,1},{1,0}};
if
(n == 0)
return
0;
ability(F, due north-1);
return
F[0][0];
}
void
multiply(
int
F[2][2],
int
M[2][2])
{
int
x = F[0][0]*K[0][0] + F[0][i]*M[1][0];
int
y = F[0][0]*M[0][one] + F[0][1]*Thou[1][ane];
int
z = F[ane][0]*M[0][0] + F[1][1]*Thousand[1][0];
int
west = F[1][0]*Grand[0][1] + F[i][ane]*Yard[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][one] = w;
}
void
power(
int
F[2][two],
int
n)
{
int
i;
int
M[two][2] = {{i,1},{1,0}};
for
(i = 2; i <= n; i++)
multiply(F, K);
}
int
main()
{
int
n = ix;
printf
(
"%d"
, fib(n));
getchar
();
return
0;
}
Java
public
class
fibonacci
{
static
int
fib(
int
n)
{
int
F[][] =
new
int
[][]{{
1
,
1
},{
1
,
0
}};
if
(north ==
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
][
ane
]*M[
one
][
0
];
int
y = F[
0
][
0
]*M[
0
][
1
] + F[
0
][
1
]*M[
1
][
1
];
int
z = F[
one
][
0
]*1000[
0
][
0
] + F[
1
][
one
]*Thou[
ane
][
0
];
int
w = F[
1
][
0
]*M[
0
][
one
] + F[
1
][
1
]*Thousand[
one
][
1
];
F[
0
][
0
] = ten;
F[
0
][
1
] = y;
F[
i
][
0
] = z;
F[
ane
][
1
] = w;
}
static
void
ability(
int
F[][],
int
northward)
{
int
i;
int
M[][] =
new
int
[][]{{
ane
,
1
},{
1
,
0
}};
for
(i =
2
; i <= north; i++)
multiply(F, M);
}
public
static
void
main (String args[])
{
int
n =
ix
;
System.out.println(fib(n));
}
};
Python3
def
fib(n):
F
=
[[
1
,
one
],
[
1
,
0
]]
if
(n
=
=
0
):
return
0
ability(F, due north
-
1
)
return
F[
0
][
0
]
def
multiply(F, M):
10
=
(F[
0
][
0
]
*
Grand[
0
][
0
]
+
F[
0
][
1
]
*
Chiliad[
ane
][
0
])
y
=
(F[
0
][
0
]
*
Thousand[
0
][
ane
]
+
F[
0
][
1
]
*
One thousand[
ane
][
one
])
z
=
(F[
one
][
0
]
*
M[
0
][
0
]
+
F[
1
][
1
]
*
M[
ane
][
0
])
west
=
(F[
1
][
0
]
*
M[
0
][
1
]
+
F[
i
][
ane
]
*
M[
one
][
ane
])
F[
0
][
0
]
=
ten
F[
0
][
1
]
=
y
F[
i
][
0
]
=
z
F[
i
][
ane
]
=
westward
def
power(F, n):
M
=
[[
i
,
1
],
[
1
,
0
]]
for
i
in
range
(
2
, n
+
1
):
multiply(F, Grand)
if
__name__
=
=
"__main__"
:
n
=
nine
impress
(fib(n))
C#
using
Arrangement;
class
GFG {
static
int
fib(
int
n)
{
int
[,]F =
new
int
[,] {{1, one},
{1, 0} };
if
(northward == 0)
return
0;
power(F, due north-one);
return
F[0,0];
}
static
void
multiply(
int
[,]F,
int
[,]G)
{
int
x = F[0,0]*Chiliad[0,0] + F[0,1]*M[1,0];
int
y = F[0,0]*One thousand[0,1] + F[0,one]*M[1,1];
int
z = F[1,0]*M[0,0] + F[1,ane]*M[ane,0];
int
w = F[1,0]*Grand[0,i] + F[1,one]*M[1,i];
F[0,0] = x;
F[0,i] = y;
F[1,0] = z;
F[i,1] = w;
}
static
void
power(
int
[,]F,
int
due north)
{
int
i;
int
[,]Thou =
new
int
[,]{{i, 1},
{1, 0} };
for
(i = 2; i <= n; i++)
multiply(F, Chiliad);
}
public
static
void
Main ()
{
int
n = nine;
Console.WriteLine(fib(n));
}
}
PHP
<?php
function
fib(
$due north
)
{
$F
=
array
(
array
(1, 1),
array
(i, 0));
if
(
$n
== 0)
render
0;
power(
$F
,
$n
- 1);
return
$F
[0][0];
}
function
multiply(&
$F
, &
$1000
)
{
$x
=
$F
[0][0] *
$Chiliad
[0][0] +
$F
[0][1] *
$M
[1][0];
$y
=
$F
[0][0] *
$G
[0][1] +
$F
[0][ane] *
$Yard
[one][1];
$z
=
$F
[ane][0] *
$M
[0][0] +
$F
[i][ane] *
$M
[1][0];
$w
=
$F
[1][0] *
$Yard
[0][1] +
$F
[1][1] *
$Grand
[1][ane];
$F
[0][0] =
$10
;
$F
[0][1] =
$y
;
$F
[1][0] =
$z
;
$F
[ane][1] =
$westward
;
}
function
power(&
$F
,
$north
)
{
$M
=
array
(
array
(one, 1),
array
(1, 0));
for
(
$i
= 2;
$i
<=
$north
;
$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 - one);
return
F[0][0];
}
office
multiply( F, Thou )
{
ten = F[0][0] * M[0][0] +
F[0][1] * K[1][0];
y = F[0][0] * 1000[0][1] +
F[0][1] * M[i][1];
z = F[i][0] * M[0][0] +
F[one][1] * M[i][0];
westward = F[1][0] * M[0][1] +
F[i][i] * G[i][ane];
F[0][0] = x;
F[0][i] = y;
F[i][0] = z;
F[1][1] = westward;
}
function
power( F, northward)
{
var
i;
var
M = [[ 1, ane ], [ 1, 0 ]];
for
(i = ii; i <= north; i++)
multiply(F, M);
}
var
n = 9;
document.write (
" "
+ fib(n));
</script>
Time Complexity: O(n)
Actress Infinite: O(1)
Method 5: (Optimized Method 4)
Method 4 can be optimized to work in O(Logn) fourth dimension complexity. We tin can do recursive multiplication to go power(M, north) in the previous method (Similar to the optimization washed in this post)
C++
#include <bits/stdc++.h>
using
namespace
std;
void
multiply(
int
F[2][two],
int
1000[2][ii]);
void
ability(
int
F[ii][2],
int
n);
int
fib(
int
n)
{
int
F[2][2] = {{1, one}, {i, 0}};
if
(northward == 0)
return
0;
power(F, north - 1);
render
F[0][0];
}
void
ability(
int
F[2][2],
int
n)
{
if
(due north == 0 || northward == 1)
return
;
int
One thousand[2][2] = {{1, i}, {one, 0}};
power(F, northward / 2);
multiply(F, F);
if
(northward % 2 != 0)
multiply(F, M);
}
void
multiply(
int
F[2][2],
int
M[2][2])
{
int
10 = F[0][0] * M[0][0] + F[0][ane] * M[i][0];
int
y = F[0][0] * M[0][one] + F[0][ane] * M[1][one];
int
z = F[1][0] * M[0][0] + F[1][1] * M[i][0];
int
westward = F[1][0] * M[0][1] + F[1][1] * M[1][1];
F[0][0] = x;
F[0][one] = y;
F[1][0] = z;
F[i][1] = westward;
}
int
master()
{
int
n = 9;
cout << fib(nine);
getchar
();
return
0;
}
C
#include <stdio.h>
void
multiply(
int
F[2][2],
int
G[2][2]);
void
power(
int
F[2][2],
int
n);
int
fib(
int
n)
{
int
F[ii][ii] = {{1,one},{ane,0}};
if
(n == 0)
render
0;
power(F, n-i);
return
F[0][0];
}
void
ability(
int
F[2][ii],
int
n)
{
if
( north == 0 || n == 1)
return
;
int
Thousand[two][2] = {{1,one},{1,0}};
power(F, n/2);
multiply(F, F);
if
(n%2 != 0)
multiply(F, Grand);
}
void
multiply(
int
F[2][2],
int
Chiliad[2][2])
{
int
x = F[0][0]*M[0][0] + F[0][1]*M[1][0];
int
y = F[0][0]*M[0][i] + F[0][1]*M[1][i];
int
z = F[1][0]*M[0][0] + F[ane][ane]*Chiliad[1][0];
int
w = F[1][0]*G[0][1] + F[ane][1]*M[ane][1];
F[0][0] = ten;
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
public
form
fibonacci
{
static
int
fib(
int
north)
{
int
F[][] =
new
int
[][]{{
one
,
1
},{
1
,
0
}};
if
(n ==
0
)
render
0
;
power(F, n-
i
);
return
F[
0
][
0
];
}
static
void
multiply(
int
F[][],
int
One thousand[][])
{
int
x = F[
0
][
0
]*M[
0
][
0
] + F[
0
][
ane
]*Thou[
one
][
0
];
int
y = F[
0
][
0
]*Grand[
0
][
1
] + F[
0
][
i
]*Yard[
1
][
1
];
int
z = F[
1
][
0
]*Thousand[
0
][
0
] + F[
i
][
1
]*K[
1
][
0
];
int
w = F[
1
][
0
]*Thousand[
0
][
one
] + F[
1
][
1
]*M[
1
][
i
];
F[
0
][
0
] = x;
F[
0
][
1
] = y;
F[
one
][
0
] = z;
F[
1
][
1
] = w;
}
static
void
power(
int
F[][],
int
northward)
{
if
( due north ==
0
|| n ==
i
)
render
;
int
Yard[][] =
new
int
[][]{{
i
,
ane
},{
ane
,
0
}};
power(F, n/
two
);
multiply(F, F);
if
(northward%
ii
!=
0
)
multiply(F, M);
}
public
static
void
chief (String args[])
{
int
n =
9
;
System.out.println(fib(north));
}
};
Python3
def
fib(n):
F
=
[[
i
,
one
],
[
i
,
0
]]
if
(n
=
=
0
):
return
0
power(F, n
-
1
)
return
F[
0
][
0
]
def
multiply(F, M):
x
=
(F[
0
][
0
]
*
G[
0
][
0
]
+
F[
0
][
1
]
*
Thou[
1
][
0
])
y
=
(F[
0
][
0
]
*
One thousand[
0
][
1
]
+
F[
0
][
1
]
*
M[
1
][
1
])
z
=
(F[
i
][
0
]
*
M[
0
][
0
]
+
F[
1
][
1
]
*
M[
1
][
0
])
w
=
(F[
1
][
0
]
*
Thou[
0
][
1
]
+
F[
ane
][
1
]
*
M[
1
][
1
])
F[
0
][
0
]
=
10
F[
0
][
1
]
=
y
F[
i
][
0
]
=
z
F[
1
][
i
]
=
w
def
ability(F, due north):
if
( northward
=
=
0
or
northward
=
=
1
):
return
;
M
=
[[
1
,
ane
],
[
i
,
0
]];
power(F, n
/
/
2
)
multiply(F, F)
if
(n
%
two
!
=
0
):
multiply(F, 1000)
if
__name__
=
=
"__main__"
:
n
=
9
print
(fib(n))
C#
using
System;
course
GFG
{
static
int
fib(
int
n)
{
int
[,] F =
new
int
[,]{{i, i},
{1, 0}};
if
(due north == 0)
return
0;
power(F, north - i);
return
F[0, 0];
}
static
void
multiply(
int
[,] F,
int
[,] M)
{
int
x = F[0, 0] * G[0, 0] +
F[0, 1] * M[ane, 0];
int
y = F[0, 0] * M[0, ane] +
F[0, 1] * Grand[1, 1];
int
z = F[1, 0] * G[0, 0] +
F[1, 1] * Yard[1, 0];
int
west = F[i, 0] * Thou[0, ane] +
F[1, 1] * M[one, ane];
F[0, 0] = ten;
F[0, 1] = y;
F[i, 0] = z;
F[1, 1] = due west;
}
static
void
power(
int
[,] F,
int
n)
{
if
( n == 0 || due north == 1)
return
;
int
[,] K =
new
int
[,]{{1, 1},
{1, 0}};
power(F, n / ii);
multiply(F, F);
if
(north % two != 0)
multiply(F, Thousand);
}
public
static
void
Main ()
{
int
north = 9;
Console.Write(fib(n));
}
}
Javascript
<script>
part
fib(northward)
{
var
F = [ [ 1, 1 ], [ 1, 0 ] ];
if
(northward == 0)
return
0;
power(F, n - 1);
render
F[0][0];
}
function
multiply(F, Grand)
{
var
x = F[0][0] * M[0][0] + F[0][1] * M[ane][0];
var
y = F[0][0] * One thousand[0][one] + F[0][1] * Chiliad[i][1];
var
z = F[1][0] * G[0][0] + F[i][i] * M[1][0];
var
w = F[one][0] * Chiliad[0][1] + F[1][1] * One thousand[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
function
power(F, due north)
{
if
(north == 0 || n == 1)
return
;
var
M = [ [ 1, 1 ], [ i, 0 ] ];
power(F, n / 2);
multiply(F, F);
if
(northward % 2 != 0)
multiply(F, M);
}
var
n = 9;
document.write(fib(n));
</script>
Fourth dimension Complexity: O(Logn)
Extra Space: O(Logn) if nosotros consider the role call stack size, otherwise O(1).
Method 6: (O(Log n) Fourth dimension)
Below is one more than interesting recurrence formula that can be used to detect n'th Fibonacci Number in O(Log n) time.
If due north is even then k = n/ii: F(northward) = [ii*F(k-1) + F(k)]*F(yard) If n is odd then k = (n + 1)/2 F(n) = F(k)*F(thousand) + F(k-ane)*F(g-one)
How does this formula piece of work?
The formula can be derived from the above matrix equation.
Taking determinant on both sides, nosotros get (-1)n = Fdue north+oneFdue north-1 - Fnorth ii Moreover, since AnAm = An+one thousand for any square matrix A, the following identities tin can be derived (they are obtained from two dissimilar coefficients of the matrix product) FyardFn + Fchiliad-oneFn-1 = Fg+n-ane ---------------------------(i) By putting n = n+1 in equation(1), FmFnorthward+ane + Fm-1Fn = Fm+n --------------------------(2) Putting 1000 = n in equation(i). F2n-1 = Fn 2 + Fnorth-1 two Putting m = due north in equation(ii) F2n = (Fn-i + Fn+1)Fdue north = (2Fn-1 + Fn)Fn (Source: Wiki) -------- ( Past putting Fn+1 = Fn + Fn-1 ) To get the formula to exist proved, nosotros simply need to practice the following If northward is even, we tin can put k = n/ii If n is odd, we can put m = (north+i)/ii
Below is the implementation of the higher up thought.
C++
#include <$.25/stdc++.h>
using
namespace
std;
const
int
MAX = chiliad;
int
f[MAX] = {0};
int
fib(
int
north)
{
if
(n == 0)
return
0;
if
(n == 1 || northward == 2)
return
(f[north] = 1);
if
(f[n])
render
f[n];
int
thou = (n & 1)? (n+1)/ii : n/ii;
f[due north] = (n & 1)? (fib(1000)*fib(k) + fib(g-ane)*fib(k-1))
: (2*fib(grand-i) + fib(k))*fib(k);
return
f[n];
}
int
main()
{
int
due north = ix;
printf
(
"%d "
, fib(n));
return
0;
}
Java
import
java.util.*;
public
class
GFG {
static
int
MAX =
m
;
static
int
f[];
public
static
int
fib(
int
due north)
{
if
(north ==
0
)
return
0
;
if
(n ==
1
|| north ==
2
)
return
(f[n] =
i
);
if
(f[n] !=
0
)
return
f[northward];
int
k = (north &
1
) ==
one
? (n +
1
) /
2
: due north /
ii
;
f[n] = (due north &
1
) ==
1
? (fib(k) * fib(thou) +
fib(m -
one
) * fib(one thousand -
one
))
: (
2
* fib(k -
one
) + fib(k))
* fib(k);
return
f[north];
}
public
static
void
primary(String[] args)
{
int
n =
nine
;
f=
new
int
[MAX];
System.out.println(fib(n));
}
};
Python3
MAX
=
1000
f
=
[
0
]
*
MAX
def
fib(n) :
if
(n
=
=
0
) :
render
0
if
(northward
=
=
1
or
northward
=
=
2
) :
f[northward]
=
1
return
(f[n])
if
(f[n]) :
return
f[n]
if
( n &
one
) :
1000
=
(due north
+
one
)
/
/
ii
else
:
k
=
n
/
/
2
if
((n &
1
) ) :
f[n]
=
(fib(yard)
*
fib(k)
+
fib(thou
-
1
)
*
fib(k
-
1
))
else
:
f[northward]
=
(
ii
*
fib(thou
-
i
)
+
fib(g))
*
fib(k)
return
f[n]
n
=
nine
print
(fib(n))
C#
using
Organization;
class
GFG
{
static
int
MAX = m;
static
int
[] f;
public
static
int
fib(
int
n)
{
if
(n == 0)
return
0;
if
(n == ane || n == ii)
return
(f[due north] = 1);
if
(f[n] != 0)
return
f[n];
int
k = (n & ane) == i ? (north + 1) / two
: n / 2;
f[n] = (north & 1) == 1 ? (fib(k) * fib(chiliad) +
fib(g - 1) * fib(grand - one))
: (2 * fib(thou - i) + fib(k)) *
fib(k);
render
f[due north];
}
static
void
Primary()
{
int
n = 9;
f =
new
int
[MAX];
Console.WriteLine(fib(n));
}
}
PHP
<?php
$MAX
= grand;
function
fib(
$n
)
{
global
$MAX
;
$f
=
array_fill
(0,
$MAX
, Nada);
if
(
$north
== 0)
return
0;
if
(
$due north
== i ||
$n
== 2)
return
(
$f
[
$n
] = 1);
if
(
$f
[
$n
])
return
$f
[
$n
];
$k
= (
$n
& one) ? (
$n
+ ane) / ii :
$n
/ 2;
$f
[
$n
] = (
$n
& 1) ? (fib(
$k
) * fib(
$k
) +
fib(
$one thousand
- 1) * fib(
$g
- 1)) :
(2 * fib(
$k
- 1) + fib(
$k
)) * fib(
$yard
);
return
$f
[
$n
];
}
$northward
= 9;
echo
fib(
$northward
);
?>
Javascript
<script>
const MAX = m;
var
f = [...Array(MAX)];
f.fill(0);
role
fib(northward) {
if
(northward == 0)
return
0;
if
(north == 1 || n == 2)
return
(f[northward] = ane);
if
(f[north])
return
f[n];
var
k = n & i ? (northward + ane) / 2 : n / 2;
f[north] =
due north & i
? fib(thou) * fib(g) + fib(1000 - 1) * fib(g - 1)
: (2 * fib(m - 1) + fib(k)) * fib(k);
return
f[n];
}
var
n = 9;
document.write(fib(northward));
</script>
Fourth dimension complexity: O(Log n), as we divide the trouble in one-half in every recursive call.
Method vii: (Another arroyo(Using Binet's formula))
In this method, we directly implement the formula for the nth term in the Fibonacci series.
Fn = {[(√v + 1)/2] ^ due north} / √five
Note: Above Formula gives correct result only upto for northward<71. Considering as nosotros motion frontward from n>=71 , rounding error becomes significantly large . Although , using floor function instead of round function will give right issue for n=71 . Only afterwards from n=72 , it also fails.
Example: For N=72 , Right result is 498454011879264 but above formula gives 498454011879265.
Reference: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html
C++
#include<iostream>
#include<cmath>
int
fib(
int
northward) {
double
phi = (1 +
sqrt
(5)) / 2;
return
circular(
prisoner of war
(phi, n) /
sqrt
(5));
}
int
main ()
{
int
n = ix;
std::cout << fib(n) << std::endl;
return
0;
}
C
#include<stdio.h>
#include<math.h>
int
fib(
int
due north) {
double
phi = (1 +
sqrt
(5)) / 2;
render
circular(
pow
(phi, n) /
sqrt
(5));
}
int
main ()
{
int
n = 9;
printf
(
"%d"
, fib(n));
return
0;
}
Java
import
java.util.*;
public
class
GFG {
static
int
fib(
int
n)
{
double
phi = (
1
+ Math.sqrt(
5
)) /
2
;
return
(
int
)Math.round(Math.pow(phi, northward)
/ Math.sqrt(
five
));
}
public
static
void
main(String[] args)
{
int
n =
9
;
Arrangement.out.println(fib(due north));
}
};
Python3
import
math
def
fibo(due north):
phi
=
(
1
+
math.sqrt(
five
))
/
2
return
circular
(
pow
(phi, n)
/
math.sqrt(
5
))
if
__name__
=
=
'__main__'
:
n
=
9
print
(fibo(northward))
C#
using
System;
public
grade
GFG
{
static
int
fib(
int
n)
{
double
phi = (1 + Math.Sqrt(5)) / 2;
render
(
int
) Math.Circular(Math.Pow(phi, n)
/ Math.Sqrt(5));
}
public
static
void
Chief()
{
int
due north = nine;
Console.WriteLine(fib(n));
}
}
PHP
<?php
part
fib(
$n
)
{
$phi
= (1 + sqrt(5)) / 2;
return
circular
(pow(
$phi
,
$due north
) / sqrt(five));
}
$n
= 9;
echo
fib(
$north
) ;
?>
Javascript
<script>
function
fib(due north) {
let phi = (1 + Math.sqrt(5)) / 2;
return
Math.round(Math.pw(phi, n) / Math.sqrt(5));
}
allow northward = 9;
document.write(fib(n));
</script>
Fourth dimension Complication : O(logn), this is considering computing phi^n takes logn time
Auxiliary Space : O(1)
Method 8: DP using memoization(Top down approach)
We tin can avoid the repeated work washed in method ane past storing the Fibonacci numbers calculated so far. We only need to store all the values in an array.
C++
#include <bits/stdc++.h>
using
namespace
std;
int
dp[x];
int
fib(
int
n)
{
if
(n <= 1)
return
n;
int
commencement, 2nd;
if
(dp[north - i] != -1)
showtime = dp[n - ane];
else
outset = fib(n - 1);
if
(dp[n - ii] != -1)
second = dp[n - two];
else
2nd = fib(due north - 2);
return
dp[due north] = outset + second;
}
int
master()
{
int
n = 9;
memset
(dp, -1,
sizeof
(dp));
cout << fib(n);
getchar
();
return
0;
}
Coffee
import
coffee.util.*;
public
course
GFG {
static
int
[] dp =
new
int
[
10
];
static
int
fib(
int
n)
{
if
(n <=
one
)
return
n;
int
first, second;
if
(dp[northward -
1
] != -
1
)
beginning = dp[n -
1
];
else
commencement = fib(n -
one
);
if
(dp[due north -
two
] != -
1
)
second = dp[north -
ii
];
else
2d = fib(n -
2
);
return
dp[n] = first + 2nd;
}
public
static
void
primary(String[] args)
{
int
n =
nine
;
Arrays.fill(dp, -
1
);
Organization.out.print(fib(north));
}
};
Python3
dp
=
[
-
1
for
i
in
range
(
10
)]
def
fib(north):
if
(due north <
=
1
):
return
due north;
global
dp;
get-go
=
0
;
second
=
0
;
if
(dp[north
-
1
] !
=
-
i
):
beginning
=
dp[n
-
1
];
else
:
first
=
fib(n
-
ane
);
if
(dp[north
-
2
] !
=
-
one
):
2nd
=
dp[north
-
2
];
else
:
second
=
fib(due north
-
two
);
dp[northward]
=
first
+
second;
return
dp[n] ;
if
__name__
=
=
'__main__'
:
n
=
9
;
print
(fib(n));
C#
using
Organisation;
grade
GFG {
static
int
[] dp =
new
int
[10];
static
int
fib(
int
n)
{
if
(north <= 1)
return
due north;
int
first, second;
if
(dp[n - 1] != -1)
first = dp[northward - 1];
else
first = fib(n - 1);
if
(dp[n - two] != -1)
second = dp[n - 2];
else
2d = fib(northward - 2);
return
dp[north] = beginning + 2nd;
}
static
void
Chief()
{
int
n = 9;
Array.Make full(dp, -i);
Console.Write(fib(north));
}
}
Javascript
<script>
dp = Array.from({length: 10}, (_, i) => -1);
function
fib(northward)
{
if
(n <= one)
render
north;
var
first, second;
if
(dp[n - 1] != -1)
first = dp[n - one];
else
kickoff = fib(n - 1);
if
(dp[n - 2] != -1)
second = dp[north - 2];
else
second = fib(due north - 2);
return
dp[n] = first + 2nd;
}
var
n = 9;
certificate.write(fib(n));
</script>
Related Articles:
Big Fibonacci Numbers in Coffee
Please write comments if you discover the above codes/algorithms wrong, or find other means to solve the aforementioned trouble.
References:
http://en.wikipedia.org/wiki/Fibonacci_number
http://www.ics.uci.edu/~eppstein/161/960109.html
5 8 13 21 34,
Source: https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
Posted by: walkupthoon1994.blogspot.com
0 Response to "5 8 13 21 34"
Post a Comment