标题: | 斐波那契数列 |
详情: | 斐波纳契数列(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]使其不被算很多次:
#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.动态规划版,不知道的去本博客的(p1048采药)
#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; }