鱼C论坛

 找回密码
 立即注册
查看: 101|回复: 7

求助~

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

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

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

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
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
但求过程001 发表于 2025-10-26 00:36
FishC 发表于 2025-10-25 23:23
别担心,递归对初学 ...


你好!很高兴看到你在努力理解汉诺塔的递归逻辑。你的理解基本正确,我来帮你梳理一下。

对于 n=5 的情况:
- 第一步:hanoi(4, A, C, B) —— 将 4 个盘子从 A 移到 B(使用 C 辅助)
- 第二步:move(A, C) —— 移动最大的盘子(第5个)从 A 到 C
- 第三步:hanoi(4, B, A, C) —— 将 4 个盘子从 B 移到 C(使用 A 辅助)

这确实是一个整体移动过程,递归会自动处理所有子步骤。

关于返回值:
- 汉诺塔的 hanoi 函数是 void 类型,意味着它没有返回值。它只通过调用 move 函数(假设已定义)来输出移动步骤,而不返回任何数据。

三个核心语句是否足够:
- 是的,这三个语句就是递归的核心逻辑,它们通过不断调用自身来分解问题,直到 n=1(直接移动)。代码本身是完整的,只要配合 move 函数的定义(例如打印移动步骤)就能运行。

例如,完整的程序框架可能像这样:

  1. #include <stdio.h>
  2. void move(char x, char y) {
  3.     printf("%c -> %c\n", x, y);
  4. }
  5. void hanoi(int n, char one, char two, char three) {
  6.     if (n == 1) {
  7.         move(one, three);
  8.     } else {
  9.         hanoi(n-1, one, three, two);
  10.         move(one, three);
  11.         hanoi(n-1, two, one, three);
  12.     }
  13. }
  14. int main() {
  15.     hanoi(5, 'A', 'B', 'C');
  16.     return 0;
  17. }
复制代码


记住,递归的关键是信任函数能正确处理子问题。多练习小例子(如 n=2 或 n=3),你会逐渐熟悉这个模式。如果还有疑问,随时再问,加油!

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

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
FishC 发表于 2025-10-25 23:23
别担心,递归对初学者来说确实有点抽象,很多人一开始都会觉得云里雾里,这是很正常的!汉诺塔的递归逻 ...

若n=5的话,就是先把n-1就是4个盘子从A借助C移到B,然后A到C,然后B再借助A到C,就是整体移动吧
这里面不存在返回值吗?只需要三个核心语句就可以实现hanoi的程序了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
但求过程001 发表于 2025-10-25 23:23
FishC 发表于 2025-10-24 23:00
当然!我来为你详细 ...


别担心,递归对初学者来说确实有点抽象,很多人一开始都会觉得云里雾里,这是很正常的!汉诺塔的递归逻辑可以通过一个简单的“三步模式”来记忆,这样你就能轻松应对这类题目了。

核心记忆模式:
1. 先把 n-1 个盘子从起点柱移到辅助柱(使用目标柱辅助)
2. 然后把最大的盘子从起点柱移到目标柱
3. 最后把 n-1 个盘子从辅助柱移到目标柱(使用起点柱辅助)

当 n=1 时,直接移动盘子即可。

你可以把这个模式背下来,然后多练习 n=2 或 n=3 的小例子来巩固。例如:
- n=2:A->B, A->C, B->C
- n=3:A->C, A->B, C->B, A->C, B->A, B->C, A->C

记住,递归就像“拆解任务”——每次把大问题变成小问题,直到最简单的情况。多练几次,你就会慢慢找到感觉的。加油,你一定可以掌握!

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

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
FishC 发表于 2025-10-24 23:00
当然!我来为你详细分解 n=3 时汉诺塔递归函数的执行过程。假设三个盘子初始在柱子 A,目标移动到柱子  ...

哎呀,我看的云里雾里的,可能我的逻辑性不那么好,如果遇到这个题目的话,看来我只有理解加背下来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
但求过程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
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

发表于 6 天前 | 显示全部楼层
你好!我来帮你理解汉诺塔递归函数中 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-30 04:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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