剑指Offer——斐波那契数列

题目描述:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39


分析:

递归解法肯定相当耗时。

因为当n=4时,程序是这样子递归运算的:
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);

Fibonacci(0),Fibonacci(1)被重复调用好多次,可从加法的次数看出递归次数,如果n很大时,那么递归的次数将会更多。所以我们不用递归的解法。

根据斐波那契数列的特征,我们只需由f[0],f[1]求出f[2],然后由f[1],f[2]求出f[3],这样子就减少了之前每步递归都要递归到f[0],f[1]所需的次数,直接可由前两个数得出。

不过我们不必开辟O(n)的空间大小来存储f[n],我们只需要两个值存储一前一后的值,循环就可得出结果。


代码:

 1 class Solution {
 2 public:
 3     int Fibonacci(int n) {
 4         if(n < 2) return n;
 5         int a = 0, b = 1;   // a是b的前一个值
 6         for(int i = 2; i <= n; i++) {   // 循环后移求出下一个b值,a一直是b的前一个值
 7             b += a; // 求出下一个值
 8             a = b - a;  // a等于之前的b值
 9         }
10         return b;
11     }
12 };

 

posted @ 2017-10-27 13:35  叶建成  阅读(206)  评论(0编辑  收藏  举报