函数中有直接或间接地调用自身函数的语句,这样的函数称为递归函数。
由于函数自己调用自己,有可能造成死循环。为了避免死循环,要做到两点:
(1)降阶。递归函数虽然调用自身,但并不是简单地重复。它的实参值每次是不一样的。一般逐渐减小,称为将阶。
(2)有出口。即在某种条件下,不再进行递归调用。
/* Hanoi塔问题 */
#include<stdio.h>
int c = 0; /* 全局变量,搬动次数 */
void move(char x, int n, char z)
{ /* 第n个圆盘从塔座x搬到塔座z */
printf("第%i步: 将%i号盘从%c移到%c\n", ++c, n, x, z);
}
void hanoi(int n, char x, char y, char z) /* 算法3.5 */
{ /* 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘 */
/* 按规则搬到塔座z上。y可用作辅助塔座 */
if (n == 1)
move(x, 1, z); /* 将编号为1的圆盘从x移到z */
else
{
hanoi(n - 1, x, z, y); /* 将x上编号为1至n-1的圆盘移到y,z作辅助塔 */
move(x, n, z); /* 将编号为n的圆盘从x移到z */
hanoi(n - 1, y, x, z); /* 将y上编号为1至n-1的圆盘移到z,x作辅助塔 */
}
}
void main()
{
int n;
printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:");
scanf("%d", &n);
hanoi(n, 'a', 'b', 'c');
}
运行结果: