【发布时间】:2017-06-30 04:24:43
【问题描述】:
我在 python 中为四个凳子实现河内塔游戏的最佳算法时遇到了很多麻烦。
首先,在课堂上,我们解决了三个塔的河内塔算法,我们得到了以下算法:
- 将除底部盘外的所有盘从源移至中间塔
- 将底部磁盘从源移动到目标
- 将除了底部圆盘之外的所有部分从中间凳子移到目标塔
该算法的实际代码(模型属于具有塔和磁盘的 Model 类,具有将磁盘从一个塔移动到另一个的 move 方法)产生:
def move_disks(n, source, intermediate, destination):
"""Move n disks from source to destination
@param int n:
@param int source:
@param int intermediate:
@param int destination:
@rtype: None
"""
if n > 1:
move_disks(n - 1, source, destination, intermediate)
move_disks(1, source, intermediate, destination)
move_disks(n - 1, intermediate, source, destination)
else:
model.move(source, destination)
现在对于四个凳子,我得到了以下内容:
- 使用所有四个塔将 n- i 磁盘移动到中间凳子
- 仅使用三个可用的塔将 i 个磁盘从原始塔移动到目标塔
- 将 n-i 个最小磁盘从中间塔移动到目标塔
手动玩转磁盘和塔,如果 n>=3,我得到 n-i = 2,如果 n =2,我得到 i = 1。由于有 4 个可能的来源和目的地,在我自己的函数中,我有 5 个参数而不是 4 个:
def move_disks(n, source, intermediate, intermediate2, destination):
"""Move n disks from source to destination
@param int n:
@param int source:
@param int intermediate:
@param int intermediate2:
@param int destination:
@rtype: None
"""
if n > 1:
move_disks(n - i, source, intermediate 2 destination, intermediate)
move_disks(1, source, intermediate, intermediate2, destination)
move_disks(n - i, intermediate, intermediate2, source, destination)
else:
print("{} -> {}".format(source,destination)) # used to explicitly follow output in the console
#model.move(source, destination) --> to be implemented when the function returns the right output
当我运行 n=3 时,我得到:
1 -> 3
1 -> 2
3 -> 2
1 -> 4
2 -> 3
2 -> 4
3 -> 4
它给出的移动数与三塔的解决方案相同。 四个凳子的最佳解决方案应该是:
1 -> 3
1 -> 2
1 -> 4
2 -> 4
3 -> 4
问题肯定来自我对算法的理解,所以我尝试在干擦板上跟踪函数调用几个小时,但无济于事。
对于我还应该做什么或寻找解决此算法的任何提示或技巧?老实说,我迷路了,有点气馁。
【问题讨论】:
-
source、intermediate和以下参数的用途是什么?除了在两个提供的 code-sn-ps 中作为递归调用的参数之外,它们在代码中没有使用。 -
代码的工作方式如下:在基本情况下,它从源 -> 目标移动。如果不是在基本情况下,它必须从源 -> 中间移动,所以中间变成新的“目的地”等等。中级和中级 2 相同。
-
我明白这一点。我的观点是,这些参数都没有以任何方式修改
-
@Paul:
n以外的参数只是塔的标签。递归发生在n上(其他参数只是重新排列)。 -
对不起,我误解了你的问题。在这个特定代码的上下文中,我们有一个塔和磁盘的模型。 move_disks 只是一个旨在以最少的移动量解决游戏的函数,因此除了我们需要移动的磁盘数量之外,代码中没有任何参数被更改——但是塔上磁盘的位置发生了变化在 Model 类(本质上是带有值列表的字典)中通过基本案例中的 move 方法进行更改。
标签: python algorithm recursion