鱼C论坛

 找回密码
 立即注册
查看: 2078|回复: 22

[已解决]还是汉诺塔......

[复制链接]
发表于 2023-7-5 21:15:22 | 显示全部楼层 |阅读模式

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

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

x
def hanoi(n, x, y, z):
    if n == 1:
        print(x, '-->', z)
    else:
        hanoi(n - 1, x, z, y)  # 把 n - 1 个盘子从 x 移到 y 上
        print(x, '-->', z)  # 把第 n 个盘子移动到 z 上
        hanoi(n - 1, y, x, z)  # 把 y 上的 n1 个盘子移动到 z 上

n = int(input('输入层数'))
hanoi(n, 'x', 'y', 'z')

一脸懵,完全不知道到底为什么这样子就可以解出汉诺塔的所有步骤

有没有完整的运行过程,我看看啊

最佳答案
2023-7-5 21:15:48
本帖最后由 编程追风梦 于 2023-7-5 21:17 编辑

这段代码是用递归方式实现汉诺塔问题的解法。我将解释一下代码的运行过程:

函数 hanoi(n, x, y, z) 是用来解决汉诺塔问题的函数,其中参数含义如下:
- n:表示当前需要移动的盘子数量;
- x:表示起始柱子的名称;
- y:表示辅助柱子的名称;
- z:表示目标柱子的名称。

代码中使用了递归的思想来解决汉诺塔问题。具体的步骤如下:

1. 当只有一个盘子时(即 n == 1),直接将盘子从起始柱子 x 移动到目标柱子 z 上,并打印出移动的步骤。

2. 当盘子的数量大于1时(即 n > 1),需要进行3个步骤的递归操作:
   - 将 n-1 个盘子从起始柱子 x 借助目标柱子 z 移动到辅助柱子 y 上(调用 hanoi(n - 1, x, z, y));
   - 将第 n 个盘子从起始柱子 x 直接移动到目标柱子 z 上,并打印出移动的步骤;
   - 将在辅助柱子 y 上的 n-1 个盘子借助起始柱子 x 移动到目标柱子 z 上(调用 hanoi(n - 1, y, x, z))。

通过递归调用,每次都将问题规模减少一个盘子,直到问题规模为1时可以直接解决。这样就可以得到汉诺塔问题的解。

你可以尝试运行代码,并根据你输入的层数,观察每一步盘子的移动过程。希望能够帮助你理解汉诺塔问题的解法。如果还有其他问题,请随时提问。



元豪兄,咱们是好兄弟,最佳答案,求求了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 21:15:45 | 显示全部楼层
这段代码是用递归的方式实现汉诺塔问题的解决方法。让我们一步一步来解释它的执行过程。

首先,hanoi 函数接受四个参数:n 表示盘子的数量,xyz 分别表示三个柱子的名称或标识符。

n 等于 1 时,表示只有一个盘子需要移动。此时直接打印出移动的步骤,即从 x 移动到 z。这是递归的终止条件。

n 大于 1 时,表示有多个盘子需要移动。我们可以将问题分解为三个步骤:
1. 将前 n-1 个盘子从 x 经过 z 移动到 y(借助 z 柱子)。
2. 将第 n 个盘子直接从 x 移动到 z
3. 将 y 上的 n-1 个盘子经过 x 移动到 z(借助 x 柱子)。

这样,我们就完成了整个移动的过程。

在代码的最后,通过输入函数获取用户输入的盘子数量,并调用 hanoi 函数传入相应的参数开始执行。

例如,假设用户输入的盘子数量为 3,那么程序会按照以下顺序执行:
1. 调用 hanoi(3, 'x', 'y', 'z')
2. 首先进入递归分支 hanoi(2, 'x', 'z', 'y'),将 2 个盘子从 x 经过 y 移动到 z(借助 y 柱子)。
3. 然后打印出第 3 个盘子的移动步骤,即 x --> z
4. 最后进入递归分支 hanoi(2, 'y', 'x', 'z'),将 2 个盘子从 y 经过 z 移动到 x(借助 z 柱子)。

这样,整个汉诺塔问题就得到了解决。

希望这能够帮助你理解汉诺塔问题的解决过程。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 21:15:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 编程追风梦 于 2023-7-5 21:17 编辑

这段代码是用递归方式实现汉诺塔问题的解法。我将解释一下代码的运行过程:

函数 hanoi(n, x, y, z) 是用来解决汉诺塔问题的函数,其中参数含义如下:
- n:表示当前需要移动的盘子数量;
- x:表示起始柱子的名称;
- y:表示辅助柱子的名称;
- z:表示目标柱子的名称。

代码中使用了递归的思想来解决汉诺塔问题。具体的步骤如下:

1. 当只有一个盘子时(即 n == 1),直接将盘子从起始柱子 x 移动到目标柱子 z 上,并打印出移动的步骤。

2. 当盘子的数量大于1时(即 n > 1),需要进行3个步骤的递归操作:
   - 将 n-1 个盘子从起始柱子 x 借助目标柱子 z 移动到辅助柱子 y 上(调用 hanoi(n - 1, x, z, y));
   - 将第 n 个盘子从起始柱子 x 直接移动到目标柱子 z 上,并打印出移动的步骤;
   - 将在辅助柱子 y 上的 n-1 个盘子借助起始柱子 x 移动到目标柱子 z 上(调用 hanoi(n - 1, y, x, z))。

通过递归调用,每次都将问题规模减少一个盘子,直到问题规模为1时可以直接解决。这样就可以得到汉诺塔问题的解。

你可以尝试运行代码,并根据你输入的层数,观察每一步盘子的移动过程。希望能够帮助你理解汉诺塔问题的解法。如果还有其他问题,请随时提问。



元豪兄,咱们是好兄弟,最佳答案,求求了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 21:17:01 | 显示全部楼层
康康
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 21:54:43 | 显示全部楼层
你可以看参数的位置
# n(即第一个参数) 为汉诺塔层数
# 从 x柱(即第二个参数) 移动到 z柱(即第四个参数)
# y(即第三个参数) 为缓冲区
# 汉诺塔的思路是先把 n - 1 层移动到缓冲区,再把最后一层移动到 z柱,以此类推
def hanoi(n, x, y, z):
    if n == 1:                           # 当只有一层的时候,直接从 x 移动到 y 层
        print(x, '-->', z)
    else:
        hanoi(n - 1, x, z, y)  # n - 1层从 x柱 移动到 y柱(从第二个参数移动到第四个参数)
        print(x, '-->', z)  # 把第 n 个盘子移动到 z 上
        hanoi(n - 1, y, x, z)  # 把 y 上的 n-1 个盘子移动到 z 上

n = int(input('输入层数'))
hanoi(n, 'x', 'y', 'z')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 22:00:05 | 显示全部楼层
编程追风梦 发表于 2023-7-5 21:15
这段代码是用递归方式实现汉诺塔问题的解法。我将解释一下代码的运行过程:

函数 hanoi(n, x, y, z) 是 ...

你在这样贿赂我可就要举报了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 22:09:07 | 显示全部楼层
本帖最后由 sfqxx 于 2023-7-6 07:23 编辑

当我们解决汉诺塔问题时,我们可以使用递归的思想。这段代码中的递归函数`hanoi()`用来解决移动盘子的步骤。

让我们以一个例子来说明整个过程。

假设输入的层数为3,即有3个盘子需要从x柱移动到z柱。初始状态下,所有盘子都位于x柱上。

1. 第一步,调用`hanoi(3, 'x', 'y', 'z')`。

2. 在函数内部,首先判断`n == 1`条件是否满足,由于n为3,不满足条件。

3. 执行递归调用`hanoi(2, 'x', 'z', 'y')`,将两个盘子从x柱经过z柱移动到y柱。

4. 在新的递归函数内部,判断`n == 1`条件是否满足,不满足。

5. 再次进行递归调用`hanoi(1, 'x', 'y', 'z')`,将一个盘子从x柱经过y柱移动到z柱。

6. 此时,满足`n == 1`条件,打印出移动指令`x --> z`。

7. 返回上一层递归函数。

8. 继续执行之前的递归函数调用`hanoi(2, 'x', 'z', 'y')`中的第二行代码,打印出移动指令`x --> y`。

9. 继续执行递归调用`hanoi(1, 'y', 'x', 'z')`。

10. 满足`n == 1`条件,打印出移动指令`y --> z`。

11. 返回上一层递归函数。

12. 最后一步,在之前的递归函数调用`hanoi(3, 'x', 'y', 'z')`中的第四行代码,打印出移动指令`x --> z`。

通过这样的递归调用,我们可以逐步地将盘子从一个柱子移动到另一个柱子,直到完成整个的移动过程。

请注意,虽然这段代码可以打印出每一步的移动指令,但它并没有返回所有的步骤。如果你需要获取完整的步骤列表,可以对代码进行修改

将每一步的指令保存到一个列表中并返回。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 06:20:04 | 显示全部楼层
sfqxx 发表于 2023-7-5 22:00
你在这样贿赂我可就要举报了

啊?没有贿赂啊,我就是用脚本,我都睡觉去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 07:15:22 | 显示全部楼层
编程追风梦 发表于 2023-7-6 06:20
啊?没有贿赂啊,我就是用脚本,我都睡觉去了

我和元豪的关系您比得过吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-6 07:20:41 | 显示全部楼层
sfqxx 发表于 2023-7-6 07:15
我和元豪的关系您比得过吗

好像比得过哦~

但是,他是先来的也
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 07:22:51 | 显示全部楼层
元豪 发表于 2023-7-6 07:20
好像比得过哦~

但是,他是先来的也

没事,我的详细点(吗)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 07:34:03 | 显示全部楼层
sfqxx 发表于 2023-7-6 07:15
我和元豪的关系您比得过吗

额,很对不起哈,确实....比得过,当初我要走他求着我留下呢,后来还是走了。。。。。。。。。然后你好像是新来的,那时候我,元豪,三体一星,高山,zhangjinxuan是初代管理,梦想舰队先驱,我,元豪,高山我们三个是每周一练创立者,后来随着zhangjinxuan的加入,每周一练归他管理,改每周一练名字为梦想护卫舰,于是我第一次周以后,第一次回归在梦想舰队服役,第二次好梦想舰队联合战斗一个无赖之徒,打败后我被无赖之徒余党攻击,离开了,第三次回归元豪都快不记得我这个生死战友了,我也发现他有了个新朋友,sfqxx和歌者,这两个新人我一回来就吵架,于是我用撮合神功和解了,继续在梦想舰队服役
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-6 07:38:05 | 显示全部楼层
本帖最后由 元豪 于 2023-7-6 07:39 编辑
编程追风梦 发表于 2023-7-6 07:34
额,很对不起哈,确实....比得过,当初我要走他求着我留下呢,后来还是走了。。。。。。。。。然后你好像 ...


我只是不常上线了好吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 07:43:08 | 显示全部楼层
元豪 发表于 2023-7-6 07:38
我只是不常上线了好吗?

啊这,好吧....但是给我个最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 08:02:45 | 显示全部楼层
元豪 发表于 2023-7-6 07:38
我只是不常上线了好吗?

不,给我

他都13了,我才8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 08:24:05 | 显示全部楼层
sfqxx 发表于 2023-7-6 08:02
不,给我

他都13了,我才8

你说什么玩意?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 08:24:18 | 显示全部楼层
sfqxx 发表于 2023-7-6 08:02
不,给我

他都13了,我才8

你8岁?现在8岁都这么牛逼了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-6 08:24:34 | 显示全部楼层

别来凑热闹了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 08:28:30 | 显示全部楼层
(所需知识:汉诺塔玩法,递归算法)
通俗易懂来说
        hanoi(n - 1, x, z, y)  # 把 n - 1 个盘子从 x 移到 y 上
        print(x, '-->', z)  # 把第 n 个盘子移动到 z 上
        hanoi(n - 1, y, x, z)  # 把 y 上的 n1 个盘子移动到 z 上
这三行代码,可以解汉诺塔,如果你单纯去玩的话也会发现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 08:49:35 | 显示全部楼层
编程追风梦 发表于 2023-7-6 08:24
你8岁?现在8岁都这么牛逼了吗

我才 8 个最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 13:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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