鱼C论坛

 找回密码
 立即注册
查看: 42|回复: 3

求助~

[复制链接]
发表于 昨天 21:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void hanoi(int n,char one,char two,char three)         //定义hanoi函数
{
        void move(char x,char y);                          //move函数声明
        if(n==1)
        {
                move(one,three);
        }
        else
        {
                hanoi(n-1,one,three,two);
                move(one,three);
                hanoi(n-1,two,one,three);
        }
}

以上是汉诺塔的hanoi函数定义部分,没明白else里面的三个语句是如何进行递归调用的,因为有两个hanoi函数,就不太懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 21:58 | 显示全部楼层
你好!我来帮你理解汉诺塔递归函数中 else 部分的工作原理。

首先,汉诺塔问题的目标是:将 n 个盘子从柱子 one 移动到柱子 three,使用柱子 two 作为辅助。递归的核心思想是将大问题分解成更小的子问题。

在 else 部分,三个语句的作用是:
  • hanoi(n-1, one, three, two):这表示先将 n-1 个盘子从 one 移动到 two(使用 three 作为辅助)。
  • move(one, three):然后移动最大的盘子(第 n 个)从 one 到 three。
  • hanoi(n-1, two, one, three):最后将 n-1 个盘子从 two 移动到 three(使用 one 作为辅助)。


递归调用会一直分解,直到 n=1(基本情况),这时直接移动盘子。

举个例子,假设 n=2(两个盘子):

  1. // 调用 hanoi(2, 'A', 'B', 'C')
  2. // 进入 else 部分:
  3. // 1. hanoi(1, 'A', 'C', 'B') -> 移动 A 到 B(因为 n=1,直接移动)
  4. // 2. move('A', 'C') -> 移动 A 到 C
  5. // 3. hanoi(1, 'B', 'A', 'C') -> 移动 B 到 C(因为 n=1,直接移动)
复制代码

这样,两个盘子就从 A 移动到了 C。

总之,递归通过不断调用自身来简化问题,直到达到基本情况。如果有更多疑问,欢迎继续问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:59 | 显示全部楼层
FishC 发表于 2025-10-24 21:58
你好!我来帮你理解汉诺塔递归函数中 else 部分的工作原理。

首先,汉诺塔问题的目标是:将 n 个盘子从 ...

那如果n=3呢?依照上面的举例形式,能再扩展一下我看一下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:00 | 显示全部楼层
但求过程001 发表于 2025-10-24 22:59
FishC 发表于 2025-10-24 21:58
你好!我来帮你理解 ...


当然!我来为你详细分解 n=3 时汉诺塔递归函数的执行过程。假设三个盘子初始在柱子 A,目标移动到柱子 C,使用柱子 B 作为辅助。

初始调用:hanoi(3, 'A', 'B', 'C')

进入 else 部分,递归分解如下:


  1. // 第一步:hanoi(2, 'A', 'C', 'B') —— 将前2个盘子从 A 移动到 B(使用 C 辅助)
  2. //   进入 hanoi(2, 'A', 'C', 'B') 的 else:
  3. //     - hanoi(1, 'A', 'B', 'C') -> 移动 A 到 C(n=1,直接移动)
  4. //     - move('A', 'B') -> 移动 A 到 B
  5. //     - hanoi(1, 'C', 'A', 'B') -> 移动 C 到 B(n=1,直接移动)
  6. //   所以,这一步实际移动序列:A->C, A->B, C->B

  7. // 第二步:move('A', 'C') —— 移动最大的盘子(第3个)从 A 到 C

  8. // 第三步:hanoi(2, 'B', 'A', 'C') —— 将前2个盘子从 B 移动到 C(使用 A 辅助)
  9. //   进入 hanoi(2, 'B', 'A', 'C') 的 else:
  10. //     - hanoi(1, 'B', 'C', 'A') -> 移动 B 到 A(n=1,直接移动)
  11. //     - move('B', 'C') -> 移动 B 到 C
  12. //     - hanoi(1, 'A', 'B', 'C') -> 移动 A 到 C(n=1,直接移动)
  13. //   所以,这一步实际移动序列:B->A, B->C, A->C
复制代码


整体移动序列为:A->C, A->B, C->B, A->C, B->A, B->C, A->C

总结:递归通过不断将问题分解为更小的 n-1 子问题,直到 n=1(直接移动)。每个 hanoi 调用都遵循相同的模式:先移动 n-1 个盘子到辅助柱,再移动最大的盘子,最后移动 n-1 个盘子到目标柱。如果有更多疑问,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-25 06:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表