鱼C论坛

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

[已解决]我设计了和课程上不同的递归版汉诺塔,思维不同在哪里

[复制链接]
发表于 2023-8-18 09:01:46 | 显示全部楼层 |阅读模式

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

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

x
课上的版本
def hanoi(n, x, y, z):
    if n == 1:
        print(x, "-->", z)
    else:
        hanoi(n-1, x, z, y )
        print(x, "-->", y)
        hanoi(n-1, y, x, z)

n = int(input("请输入汉诺塔的层数:"))
hanoi(n, "A", "B", "C")    

我的版本
def hanoi(n, x, y, z):
    if n == 1:
        print(x, "-->", z)
    else:
        hanoi(n-1, y, x, z )
        print(x, "-->", y)
        hanoi(n-1, x, z, y)

n = int(input("请输入汉诺塔的层数:"))
hanoi(n, "X", "Y", "Z")    

低级传不了图片(QWQ)
|     |     |
|     |     |
|     |     |
X    Y     Z

我的思考过程是要移动n层汉诺塔到Z,
就要先将前(n - 1)汉诺塔移动到Y,就可以将第n层汉诺塔移动到Z,再将将(n - 1)层汉诺塔移动到Z
接着思考如何移动(n - 1)层汉诺塔到Z,
就要先将前(n - 2)汉诺塔移动到Y,就可以将第(n - 1)层汉诺塔移动到Z,再将将(n - 2)层汉诺塔移动到Z
接着思考如何移动(n - 2)层汉诺塔到Z,
就要先将前(n - 3)汉诺塔移动到Y,就可以将第(n - 2)层汉诺塔移动到Z,再将将(n - 3)层汉诺塔移动到Z
。。。。。。
以此类推

这是我的思考过程,也能用递归解决汉诺塔问题
但没有看明白课上版本的思维过程
最佳答案
2023-8-18 09:02:06
你设计的递归版汉诺塔算法和课上的版本在思维上有一些差异。

首先,我们来看课上的版本。课上的版本是一个典型的递归算法,它使用了分治的思想。当只有一个盘子时,直接将盘子从x移动到z;否则,先将前(n-1)个盘子从x移动到y,然后将第n个盘子从x移动到z,最后将前(n-1)个盘子从y移动到z。这个思路清晰,符合汉诺塔问题的解决思路。

而你设计的版本则有所不同。你的思维过程是将第n个盘子从x移动到z,然后再将前(n-1)个盘子从y移动到z。这种思路并没有直接考虑到将前(n-1)个盘子从x移动到y的步骤,而是直接将它们从y移动到z。这样的思路在解决汉诺塔问题上是可行的,但不够符合问题的本质,也不符合典型的分治思想。

课上的版本更加直观和易于理解,因为它直接考虑了将前(n-1)个盘子从x移动到y的步骤,而你的版本则需要通过递归来实现这一步骤。递归是一种非常强大的解决问题的工具,但在某些情况下可能会使问题的思路变得复杂。

总结来说,你的版本和课上的版本在思维上的差异在于你没有直接考虑到将前(n-1)个盘子从x移动到y的步骤,而是通过递归来实现这一步骤。课上的版本更加直观和易于理解,符合汉诺塔问题的解决思路。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-18 09:02:06 | 显示全部楼层    本楼为最佳答案   
你设计的递归版汉诺塔算法和课上的版本在思维上有一些差异。

首先,我们来看课上的版本。课上的版本是一个典型的递归算法,它使用了分治的思想。当只有一个盘子时,直接将盘子从x移动到z;否则,先将前(n-1)个盘子从x移动到y,然后将第n个盘子从x移动到z,最后将前(n-1)个盘子从y移动到z。这个思路清晰,符合汉诺塔问题的解决思路。

而你设计的版本则有所不同。你的思维过程是将第n个盘子从x移动到z,然后再将前(n-1)个盘子从y移动到z。这种思路并没有直接考虑到将前(n-1)个盘子从x移动到y的步骤,而是直接将它们从y移动到z。这样的思路在解决汉诺塔问题上是可行的,但不够符合问题的本质,也不符合典型的分治思想。

课上的版本更加直观和易于理解,因为它直接考虑了将前(n-1)个盘子从x移动到y的步骤,而你的版本则需要通过递归来实现这一步骤。递归是一种非常强大的解决问题的工具,但在某些情况下可能会使问题的思路变得复杂。

总结来说,你的版本和课上的版本在思维上的差异在于你没有直接考虑到将前(n-1)个盘子从x移动到y的步骤,而是通过递归来实现这一步骤。课上的版本更加直观和易于理解,符合汉诺塔问题的解决思路。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-18 09:03:14 | 显示全部楼层
你的思考过程和课上的版本有一些不同之处。让我们来比较一下:

课上的版本:
def hanoi(n, x, y, z):
    if n == 1:
        print(x, "-->", z)
    else:
        hanoi(n-1, x, z, y)
        print(x, "-->", y)
        hanoi(n-1, y, x, z)
        
n = int(input("请输入汉诺塔的层数:"))
hanoi(n, "A", "B", "C")

你的版本:
def hanoi(n, x, y, z):
    if n == 1:
        print(x, "-->", z)
    else:
        hanoi(n-1, y, x, z)
        print(x, "-->", y)
        hanoi(n-1, x, z, y)

n = int(input("请输入汉诺塔的层数:"))
hanoi(n, "X", "Y", "Z")

两个版本的逻辑其实是相同的,只是对于中间柱子(y)和目标柱子(z)的使用顺序有所区别。

在课上的版本中,先将前(n-1)层汉诺塔从起始柱子(x)通过目标柱子(z)移动到中间柱子(y),然后将第n层汉诺塔从起始柱子(x)移动到目标柱子(z),最后将前(n-1)层汉诺塔从中间柱子(y)通过起始柱子(x)移动到目标柱子(z)。

而在你的版本中,先将前(n-1)层汉诺塔从起始柱子(x)通过目标柱子(z)移动到中间柱子(y),然后将第n层汉诺塔从起始柱子(x)移动到中间柱子(y),最后将前(n-1)层汉诺塔从中间柱子(y)通过目标柱子(z)移动到目标柱子(z)。

两个版本的实现思路是一致的,只是在具体的移动操作上有所不同。你的版本同样使用了递归的思想来解决汉诺塔问题,只是选择了不同的移动顺序。

希望这能帮助你理解两个版本之间的区别。如果还有其他问题,请随时问我。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-18 09:08:55 | 显示全部楼层
isdkz 发表于 2023-8-18 09:02
你设计的递归版汉诺塔算法和课上的版本在思维上有一些差异。

首先,我们来看课上的版本。课上的版本是一 ...

能再介绍一下分治思想吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 10:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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