递推与递归的区别:
n 递推是数学上的概念,主要是指递推式或者说递推数列,递推函数,也就是说一个数列的下面一项有它的前面几项的值的一种运算(或者函数)构成,
n 比如a[n]=a[n-1]+a[n-2];
递归是计算机中的概念,主要是指递归函数(计算机中函数同数学上函数意义也不相同,是指一段代码),就是指会调用自己的函数。显然,数学中的递推函数在计算机实现中可以通过递归来实现,但不一定要通过递归来实现。
比如上面的数列,可以通过递归来实现为:
int Fib(int n){
if(n<=2)return 1;
return Fib(n-1)+Fib(n-2);
}
但是,也可以不通过递归(函数不调用自己)来实现,比如
int Fib(int n){
int f1=1,f2=1;
int i;
if(n<=2)return 1;
for(i=3;i<=n;i++){
int f=f1+f2;
f1=f2;f2=f;
}
return f;
}
例题:
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封,共有多少种不同情况。
1、当N=1和2时,易得解~,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:
2、当有N封信的时候,前面N-1封信可以有N-1或者 N-2封错装
3、前者,对于每种错装,可从N-1封信中任意取一封和第N封错装,故=F(N-1)*(N-1)
4、后者简单,只能是没装错的那封和第N封交换信封,没装错的那封可以是前面N-1封中的任意一个,故= F(N-2) * (N-1)
基本形式:d[1]=0; d[2]=1
递归式:d[n]= (n-1)*( d[n-1] + d[n-2])
这就是著名的错排公式J