题目

大家都知道斐波那契数列,现在要求输入一个整数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用来统计计算出了几个数,循环终止条件。