剑指offer——斐波那契数列
问题描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
注:斐波那契数列的定义
f
(
n
)
=
{
0
n
=
0
1
n
=
1
f
(
n
−
1
)
+
f
(
n
−
2
)
n
>
1
f(n) = \begin{cases} 0 & n= 0 \\ 1 & n=1 \\ f(n-1)+f(n-2) & n>1 \end{cases}
f(n)=⎩⎪⎨⎪⎧01f(n−1)+f(n−2)n=0n=1n>1
思路分析
解法一 :直接用公式,但是效率低。(约10000ms)
public class Solution {
public int Fibonacci(int n) {
if(n>39){
return n;
}
if(n<=0){
return 0;
}
if(n==1){
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
解法二:把已经得到的数列的中间项保存下来。下次计算的时候先查找。(约14ms)
如:
f(0)和f(1)得到f(2)
f(1)和f(2)得到f(3) ......
代码
public class Solution {
public int Fibonacci(int n) {
int result[]={0,1};
if(n<2){
return result[n];
}
int fib_NMinusOne=1;
int fib_NMinusTwo=0;
int fib_N=0;
for(int i=2;i<=n;i++){
fib_N=fib_NMinusOne+fib_NMinusTwo;
fib_NMinusTwo=fib_NMinusOne;
fib_NMinusOne=fib_N;
}
return fib_N;
}
}