汉诺塔问题

    如图 所示,有 3 个圆柱 A、B、C。A 柱上有几个圆环(图示为 4 个),要求将它们全
部移到 C 柱上。每次只能移动一个,可用 B柱作为过渡,但无论在哪个柱子上,小环都不能放
在大环下面。
 

  

  解:解题算法如下:
① 若 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值