本帖最后由 lyt0707 于 2018-5-5 10:03 编辑
标题: | 斐波那契数列 | 详情: | 斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21……从第三项开始每一项是前两项的和。
现在输入一个数n,需要求斐波纳契数列第n项的值。
|
(http://bbs.codeaha.com/problem-1031.html)
这题我用三种方法:1.普通dfs,2.记忆化dfs,3.动态规划。 1.普通dfs,只用想我要求f[n],需用知道f[n-1]与f[n-2],一直推下去推到n-1=2,n-2=1时递推完毕,代码如下: - #include <cstdio>
- int n;//这里n可以开全局也可以不开
- int dfs(int num)
- {
- if(num==1 || num==0)//边界值,num=1,0会推出
- {
- return num;//return返回到上一个递归
- }
- return dfs(num-1)+dfs(num-2); //num=num-1+num-2是斐波那契公式,返回上一个递归
- }
- int main()
- {
- scanf("%d",&n);
- printf("%d",dfs(n));
- return 0;
- }
复制代码2.记忆化dfs,记忆每个f[n],把每一个dfs(x-1)记忆到数组f[x-1]使其不被算很多次: - [/p][p=26, null, left]#include <cstdio>
- int f[1009];
- int dfs(int x)
- {
- if(f[x]==0) //如果f[x]没算过,这里已经是边界值了因为算到f[1],f[2]时f[x]==0不成立
- {
- f[x]=dfs(x-1)+dfs(x-2);//算一遍
- }
- return f[x];//如果f[x]算过,直接return
- }
- int main()
- {
- int n;
- f[1]=1;//第一个数于第二个数都设为1。
- f[2]=1;
- scanf("%d",&n);
- printf("%d",dfs(n));
- return 0;
- }
复制代码3.动态规划版 - #include <cstdio>
- #include <cstdlib>
- int main()
- {
- int f[1009],i,n;
- f[1]=1;
- f[2]=1;
- scanf("%d",&n);
- for(i=3;i<=n;i++)//一定要从3开始,不然会seg错误
- {
- f[i]=f[i-1]+f[i-1];//斐波那契数列公式,别把状态转移方程想复杂了
- }
- printf("%d",f[n]);
- return 0;
- }
复制代码
|