Easy
The Fibonacci numbers, commonly denoted F(n)
form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0
and 1
. That is,
F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), for N > 1.
Given N
, calculate F(N)
.
Example 1:
Input: 2 Output: 1 Explanation: F(2) = F(1) + F(0) = 1 + 0 = 1.
Example 2:
Input: 3 Output: 2 Explanation: F(3) = F(2) + F(1) = 1 + 1 = 2.
Example 3:
Input: 4 Output: 3 Explanation: F(4) = F(3) + F(2) = 2 + 1 = 3.
Note:
0 ≤ N
≤ 30.
题目大意:满足以下条件的数列F称为斐波那契数列:
1.F(0)=0,F(1)=1;
2.F(n)=F(n-1)+F(n-2);
给出一个数字x,求出F(x)的值。
方法:菲波那切数列除了初始条件n=0和n=1的值以外,其他的项的值都是由该项的前两项决定的,所以这是一个动态规划的问题。
方法一:递归法
递归的终止条件由斐波那契数列的初始值决定,即当n=0时结果为0,n=1时结果为1.
代码如下:
class Solution { public: int fib(int N) { if(N==0 || N==1)return N; return (fib(N-1)+fib(N-2)); } };
方法二:迭代法
由菲波那切数列的性质,使用循环逐个计算知道求出目标项的值。我们可以维护一个有两项的向量,下一项的值就有这两项求出。初始值n=0和n=1还是要先给出。
一次循环更新两项:
我们由更新结果可以看出循环次数为N/2,每次循环N的值要更新为N-2.这样就能保证结果在我们维护的这个向量当中。如果N为偶数则结果为第一项,如果N为奇数结果为第二项。
值得注意的是,向量更新时的顺序,由上图为例,F(2)由F(0)和F(1)求出,而F(3)由F(1)和F(0)求出,所以要先更新向量的第一项,再更新第二项。切忌交换顺序。
代码如下:
class Solution { public: int fib(int N) { if(N==0 || N==1)return N; vector<int> fib={0,1}; while(N/2){ fib[0]=fib[0]+fib[1]; fib[1]=fib[0]+fib[1]; N-=2; } return N==0?fib[0]:fib[1]; } };