地址:
力扣https://leetcode-cn.com/problems/fibonacci-number/
题目:
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1 |
示例 2:
输入:n = 3 输出:2 解释:F(3) = F(2) + F(1) = 1 + 1 = 2 |
示例 3:
输入:n = 4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3 |
提示:
0 <= n <= 30 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fibonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
题目连求解的公式都给定了,第一反应自然就是递归
递归是从上到下的方法,最大数到最小数。
如果改成循环的方法,就是从下到上,有最小数构建最大数的过程
这篇文章另外一个重要的思想是采用 动态规划,可以参考 动态规划详解
动态规划的两个重要步骤:
1. 存放元素的数组,里面的元素到底是存放什么
直接对应一维数组,元素值就是计算的结果
2. 计算公式
题目已经给定:f(n) = f(n-1) + f(n-2)
方法一、递归
int fib(int n){
if(n == 0)
return 0;
else if(n == 1)
return 1;
return fib(n-1)+fib(n-2);
}
方法二、循环
int fib(int n){
int pre=1, ppre=0;
int ret;
if(n == 0)
return 0;
else if(n == 1)
return 1;
for(int i=2; i<=n; i++)
{
ret=pre+ppre;
ppre=pre;
pre=ret;
}
return ret;
}
方法三、动态规划
int fib(int n){
int dp[n+1];
if(n == 0)
dp[0] = 0;
else if(n >= 1)
{
dp[0] = 0;
dp[1] = 1;
}
for(int i=2; i<=n; i++)
{
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}