题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
斐波那契数列:这个数列从第3项开始,每一项都等于前两项之和。1、1、2、3、5、8、13、21、34、……
思路
- f(n) = f(n-1) + f(n-2),第一眼看就是递归啊,简直完美的递归环境,递归肯定很爽,这样想着关键代码两三行就搞定了,注意这题的n是从0开始的:
if(n<=1) return n;
else return Fibonacci(n-1)+Fibonacci(n-2);
然而并没有什么用,测试用例里肯定准备着一个超大的n来让Stack Overflow,递归本质是利用栈,栈深度太深就会溢出; - 非递归的方法,就是剑指offer思路,每次使用两个变量a,b来计算下一个数的值sum,然后a,b,sum分别是斐波那契数列中的三个数,那么就令a=b,b=sum,这样a和b就往下移动了一个位置,再计算sum就是滴4个数了,重复这个过程即可。
代码
package JZoffer;
public class Solution_Fibonacci {
public int Fibonacci(int n){
//数列第一、二个数,总和
int first=0;
int second=1;
int sum=0;
if(n==0){
return 0;
}
if(n==1){
return 1;
}
int i = 2;
while (i<=39){
sum=first + second;
first=second;
second=sum;
if(i==n)
break;
i++;
}
//上面的循环等效于下面的for循环
for(int i=2;i<=n;i++){
sum=first + second;
first=second;
second=sum;
}
return sum;
}
}
讲解
- 3-8行就是初始值n的个数为0或者1,直接返回当前结果
- 11-17行就是计算斐波那契数列的下一个数,其中i用来统计计算出了几个数,循环终止条件。