二维递推&间接递推&递归分析
二维递推
走地图
#include<stdio.h>
#define MAX 200
int f[MAX][MAX];
int Go(int n)
{
int i,j;
for(i=0;i<n;i++)
{
f[0][i]=1;
}
for(i=1;i<n;i++)
for(j=i;j<n;j++)
{
f[i][j]=f[i-1][j]+f[i][j-1];
}
return f[n-1][n-1];
}
void main()
{
int n=6;
Go(n);
printf("%d",Go(n));
}
result
不定方程
买鱼,鸡,鸭(笑死我了,我不会用return返回多个值,求救大佬)
#include<stdio.h>
#define MAX 200
int f[MAX];
int g[MAX];
int h[MAX];
int indefinite_equation1(int n)
{
int i;
f[0]=g[0]=h[0]=1;
f[1]=1;g[1]=0;h[1]=0;
for(i=2;i<=n;i++)
{
h[i]=(i/3==0)?1:0;
g[i]=h[i]+g[i-2];
f[i]=g[i]+f[i-1];
}
return f[n];
}
int indefinite_equation2(int n)
{
int i;
f[0]=g[0]=h[0]=1;
f[1]=1;g[1]=0;h[1]=0;
for(i=2;i<=n;i++)
{
h[i]=(i/3==0)?1:0;
g[i]=h[i]+g[i-2];
f[i]=g[i]+f[i-1];
}
return g[n];
}
int indefinite_equation3(int n)
{
int i;
f[0]=g[0]=h[0]=1;
f[1]=1;g[1]=0;h[1]=0;
for(i=2;i<=n;i++)
{
h[i]=(i/3==0)?1:0;
g[i]=h[i]+g[i-2];
f[i]=g[i]+f[i-1];
}
return h[n];
}
void main()
{
int n=100;
printf("%d %d %d",indefinite_equation1(n),indefinite_equation2(n),indefinite_equation3(n));
}
结果也有问题
递归计算与递推计算的对比
fibonacci递推算法
int f[100];
int fib(int n){
f[0]=f[1]=1;
for(int i=2;i<=n;i++)
f[i]=f[i-1]+f[i-2];
return f[n];
}
fibonacci递归算法
int f(int n){
if(n==0||n==1)
return 1;
else
return f(n-1)+f(n-2);
}
递归算法时间复杂度呈现指数爆炸状态,若将f(n-2)换为k(常数),则两算法时间复杂度相同