重点:
1.待解问题 必须能被分解成相同问题的子问题。
2.分清属于两种递归中的那一种,一种直接递归,一种间接递归。
直接递归:函数内部就开始调用自身,形成递归
间接递归:如:fun_a 调用fun_b,而fun_b反过来再调用fun_a,形成递归
3.******if条件结束语句,一定要写(最好直接写在函数开头,免得后面写的忘性了,就忘记了)!!!
例子:
1.阶乘:
代码:
long JC(int n)
{
if(n <= 1)
return n;
else
return n*JC(n-1);
}
2.汉诺塔(A,B,C三个柱子,把A上的盘子全移到C上,大的只能在小的下面)。
按照上面的三点:
1. 一共分三步进行。第一:把A上的n-1个移到b上,第二:把A上最后一个移到C,第三:把B上的n-1个移到C
三步可以分别理解为:
(A,C,B),(A,B,C),(B,A,C)
(对于第一步上的(n-1个的)B的处理。第一:(n-1-1)移到A。第二:剩下最大的到C,第三剩下的A上的(n-1-1)移到C)
...
...
...
此时从括号里开始现成了一个回到A的循环!!!(把n-1-1个移到C)。个人觉得,这是思想上最重要的一点!
2.直接调用
3.结束就是最后一个从A到C
我刚开始就是懒得去想,觉得简单,结果一直似懂非懂的,代码也写不出来。事实证明还是要脚踏实地,多学多练。
代码:
#include <stdio.h>
void hnt(char a,char b,char c,int n);
int cnt;
int main()
{
int i;
//char A,B,C;
cnt = 0;
printf("请输入汉诺塔盘子个数:");
scanf("%d",&i);
hnt('A','B','C',i);
printf("一共移动了%d步\n",cnt);
return 0;
}
void hnt(char a,char b,char c,int n)
{
if(1 == n)
{
printf("第%d次移到:把%c上的移到%c上\n",++cnt,a,c);
}
else
{
hnt(a,c,b,n-1);
printf("第%d次移到:把%c上的移到%c上\n",++cnt,a,c);
hnt(b,a,c,n-1);
}
}