添柴1031斐波那契数列

标题: 斐波那契数列
详情: 斐波纳契数列(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;
}

猜你喜欢

转载自blog.csdn.net/lyt0707/article/details/80202484