如图 所示,有 3 个圆柱 A、B、C。A 柱上有几个圆环(图示为 4 个),要求将它们全
部移到 C 柱上。每次只能移动一个,可用 B柱作为过渡,但无论在哪个柱子上,小环都不能放
在大环下面。
部移到 C 柱上。每次只能移动一个,可用 B柱作为过渡,但无论在哪个柱子上,小环都不能放
在大环下面。
解:解题算法如下:
① 若 A 柱上的圆环只有一个,即 n=1 时,可将它直接移动到 C 柱上。否则,执行后续
步骤。
② 用 C 柱作为过渡,将 A 柱上 n−1 个圆环移动到 B柱上。
③ 将 A 柱上最下面的大环移动到 C 柱上。
④ 用 A 柱作过渡,将 B柱上的 n−1 个圆环移动到 C 柱上。
上述算法描述可直接转换为程序语句如下:
当 n=4 时,用语句 Hanoi(4, 'A', ' B', 'C')调用该函数,打印出以下关于操作步骤的说明:
move A to B
move A to C
move B to C
move A to B
move C to A
move C to B
move A to B
move A to C
move B to C
move B to A
move C to A
move B to C
move A to B
move A to C
move B to C
① 若 A 柱上的圆环只有一个,即 n=1 时,可将它直接移动到 C 柱上。否则,执行后续
步骤。
② 用 C 柱作为过渡,将 A 柱上 n−1 个圆环移动到 B柱上。
③ 将 A 柱上最下面的大环移动到 C 柱上。
④ 用 A 柱作过渡,将 B柱上的 n−1 个圆环移动到 C 柱上。
上述算法描述可直接转换为程序语句如下:
<strong>// move n disks from A to C
// using B as intermedia position
void Hanoi(int n, char A, char B, char C)
{
if (n == 1)
// if n ==1, move the disk from A to C
printf("move %c to %c\n", A, C);
else {
// move n-1 disks to B
// using C as intermedia position
Hanoi(n - 1, A, C, B);
// move the disk from A to C
printf("move %c to %c\n", A, C);
// move the disk from B to C
// using A as intermedia position
Hanoi(n -1, B, A, C);
}
}</strong>
当 n=4 时,用语句 Hanoi(4, 'A', ' B', 'C')调用该函数,打印出以下关于操作步骤的说明:
move A to B
move A to C
move B to C
move A to B
move C to A
move C to B
move A to B
move A to C
move B to C
move B to A
move C to A
move B to C
move A to B
move A to C
move B to C
从上述介绍可归纳出递归的一些特点:
• 一个复杂问题,若能够分解为几个解法相同或类似、但复杂程度降低的子问题,而且如
果能解决这些子问题,原来的问题也就解决了。这种问题可用递归方法解决。
• 递归算法必须有结束条件,否则便会陷入无穷循环。当分解后的子问题可直接解决时,
就停止问题分解。这些可直接求解的问题称为递归结束条件,如阶乘函数中的递归结束条件是
0!=1。汉诺塔问题中,步骤①,即当 A 柱上只有一个圆环时,可将它直接移动到 C 柱上,也
是递归结束条件。
• 递归定义的函数可简单地用递归过程求解。
• 一个复杂问题,若能够分解为几个解法相同或类似、但复杂程度降低的子问题,而且如
果能解决这些子问题,原来的问题也就解决了。这种问题可用递归方法解决。
• 递归算法必须有结束条件,否则便会陷入无穷循环。当分解后的子问题可直接解决时,
就停止问题分解。这些可直接求解的问题称为递归结束条件,如阶乘函数中的递归结束条件是
0!=1。汉诺塔问题中,步骤①,即当 A 柱上只有一个圆环时,可将它直接移动到 C 柱上,也
是递归结束条件。
• 递归定义的函数可简单地用递归过程求解。