1、经典斐波那契函数求解(递推方法)
递推方程An = An-1 + An-2
A0 = 0
A1 = 1
代码:
int Fibonacci(int n){
if(n == 1 || n == 0){
return n;
}else{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
问题:时间负复杂度太高有太多的重复计算,会导致时间复杂度为指数级
例如,求An时需要计算An-1 和An-2, 求An-1时需要计算An-2 和An-3。。。
解决,将重复计算用数组dp存储起来用的时候直接拿出来。
2、动态规划方法求解斐波那契函数
#include <iostream>
#include <cstdio>
using namespace std;
int dp[1000]; //用来存储重复的计算
int main(){
dp[0] = 0;
dp[1] = 1; //边界
int n;
cin >> n;
for(int i = 2; i <= n; i ++){
dp[i] = dp[i - 1] + dp[i - 2]; //转换方程
}
cout << dp[n] << endl;
return 0;
}
3、实例演示(斐波那契函数的实例)
题目描述
名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。 妈妈告诉名名每天可以吃一块或者两块巧克力。 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案; 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案; 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案; 如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。 现在给定N,请你写程序求出名名吃巧克力的方案数目。
输入描述:
输入只有1行,即整数N。
输出描述:
可能有多组测试数据,对于每组数据, 输出只有1行,即名名吃巧克力的方案数。
示例1
输入
4
输出
5
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n;
while(scanf("%d", &n) != EOF){
int step[n + 1];
step[1] = 1;
step[2] = 2;
for(int i = 3; i <= n; i ++){
step[i] = step[i - 1] + step[i - 2];
}
cout << step[n] << endl;
}
return 0;
}
本文深入探讨了斐波那契数列的求解方法,首先介绍了经典的递归方法及其存在的时间复杂度过高的问题,随后提出了使用动态规划进行优化的解决方案,最后通过一个实际案例——名名吃巧克力的方案数目的问题,展示了动态规划方法在解决此类问题上的应用。
1396

被折叠的 条评论
为什么被折叠?



