九歌当下 发表于 2023-8-18 09:01:46

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

课上的版本
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
。。。。。。
以此类推

这是我的思考过程,也能用递归解决汉诺塔问题
但没有看明白课上版本的思维过程

isdkz 发表于 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的步骤,而是通过递归来实现这一步骤。课上的版本更加直观和易于理解,符合汉诺塔问题的解决思路。

陶远航 发表于 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)。

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

希望这能帮助你理解两个版本之间的区别。如果还有其他问题,请随时问我。
如果问题已经解决,请设置最佳答案

九歌当下 发表于 2023-8-18 09:08:55

isdkz 发表于 2023-8-18 09:02
你设计的递归版汉诺塔算法和课上的版本在思维上有一些差异。

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

能再介绍一下分治思想吗{:9_241:}
页: [1]
查看完整版本: 我设计了和课程上不同的递归版汉诺塔,思维不同在哪里