关于递归,必须了解其关键的思想,重复相同的动作,但处理的却是不同的数据,在几乎所有我所见过的递归函数中,都是这样. 几乎都是让数据之间进行交换,然后以相同的“机器”去加工.
故此引入著名的Tower of Hanoi:
#include<stdio.h>
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("Move disk %d from %c to %c\n", n, A, C);
}
else
{
hanoi(n - 1, A, C, B);
printf("Move disk %d from %c to %c\n", n, A, C);
hanoi(n - 1, B, A, C);
}
}
void main()
{
int n;
printf("请输入数字n以解决n阶汉诺塔问题:\n");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
fflush(stdin);
getchar();
}
观察代码,
第一个递归语句,交换后两个目标(塔)
第二个递归语句,交换前两个目标(塔)
通过一步步的执行,我们也同样会发现,第一个递归语句调用并返回初始时,正是把n-1个(最大的盘子的上边所有的)盘子移到了别的柱子上.
此时,我们就要从汉诺塔的具体情况来分析了,其所要做的,就是把n-1通过B移到C(当然可以c到b),然后把第n移到B,然后把之前的n个通过A移到B,而其递归的插入点,就是从0到n的移动,记住,当移动上面的任何多少层塔时,其下面的任何多少层塔都是可以无视的,总比其上打,且其上的任何多少层塔的移动,都是靠一个柱子移到另一个柱子.
其实,总的来说,递归算法可以说是从结果出发的,以发现其规律性.