剑指Offer刷题笔记,方便日后查看。
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
题目解析
斐波拉契数列的定义如下:
- 方法一:递归
在开始学习C语言的时候,课本是就是用斐波拉契数列的例子讲解的递归,学习过编程语言的人应该都有印象,还有一道题使用递归的题就是汉诺塔问题,都是很经典的问题。我们都知道递归的优点是代码简洁,将大问题拆解成一样的小问题,用同样的方法去解决。但是递归的效率确实不高,还有一个问题就是可能引起栈溢出。
我们求解 f ( 10 ) f(10) f(10)为例分析递归的求解过程。想要求 f ( 10 ) f(10) f(10)就要求出发 f ( 9 ) f(9) f(9)和 f ( 8 ) f(8) f(8),同样。想要求得 f ( 9 ) f(9) f(9),需要先求得 f ( 8 ) f(8) f(8)和 f ( 7 ) f(7) f(7)…我们可以用树形结构来表示这种关系。如下图所示。
- 方法二:循环
更简单的办法是从下往上计算,首先根据 f ( 0 ) f(0) f(0)和 f ( 1 ) f(1) f(1)算出 f ( 2 ) f(2) f(2),再根据 f ( 1 ) f(1) f(1)和 f ( 2 ) f(2) f(2)算出 f ( 3 ) f(3) f(3)…以此类推就可以算出第n项了,这种思想的时间复杂度为 O ( n ) O(n) O(n)。
代码实现
class Solution {
public:
int Fibonacci(int n) {
if(n==0 )
return 0;
if(n==1)
return 1;
int first=0,second=1,third=0;
for(int i=2;i<=n;i++){
third = first+second;
first = second;
second = third;
}
return third;
}
};
int main(){
Solution s;
int re = s.Fibonacci(32);
cout<<re<<endl;
return 0;
}