递推就是每个数据和他前面的若干数据项(或后面的若干数据项)有一定的关联关系;一般有以下几种关系;
简单的Hanoi塔问题:
递推关系式Fn=2*F(n-1)+1;(n>=2)
程序如下:
#include <stdio.h>
#include <stdlib.h>
#define N 64
int main()
{
int i,n;
long long h[N+1];
h[1]=1;//h[0]不用
for(i=2;i<=N;i++)
{
h[i]=2*h[i-1]+1;
}
return 0;
}
Fibonacci类问题(兔子繁殖)
递推关系:F[x]=F[x-1]+F[x-2];(x>=2)
F[0]=0;F[1]=1;相类似的还有骨牌问题
有时可能会有一些变式,比如刚出生的兔子从第四个年头才能产新兔子这样的递推关系就变成了F[x]=F[x-1]+F[x-3];(x>=4)
错排公式
问题:某人写了n封信和n个信封,如果所有的信都装错了信封。求一共有多少种可能
递推关系: f[i]=(i-1)*(f[i-1]+f[i-2])(i>=3);,f[1]=0;f[2]=1;
程序如下;
#include <stdio.h>
#include <stdlib.h>
#define N 64
int main()
{
int i,n;
long long f[N+1];
f[1]=0;//h[0]不用
f[2]=1;
for(i=3;i<=N;i++)
{
f[i]=(i-1)*(f[i-1]+f[i-2]);
}
return 0;
}
错排公式:某人写了n封信,如果所有的心都装错了信封,求一共有多少种情况?
递推关系:f[n]=(n-1)*(f[n-1]+f[n+2])(n>2);
f[1]=0;f[2]=1;
代码如下:
long long int x[30];
int i;
x[1]=0;
x[2]=1;
for(i=3; i<=26; i++)
{
x[i]=(i-1)*(x[i-1]+x[i-2]);
}