gpt4 book ai didi

python - 尝试用数组实现递归的汉诺塔算法

转载 作者:太空狗 更新时间:2023-10-30 03:00:53 24 4
gpt4 key购买 nike

尽管这里有很多关于这个问题的问题,但没有一个能帮助我解决这个问题。我明白递归是什么,我可以轻松地自己用 2^n-1 步解决汉诺塔,但我在用 Python 编写算法时遇到了问题。基本情况有效,但我似乎无法找到一种方法将“将 n-1 个磁盘移动到辅助 Hook ,然后将最大的磁盘移动到目标 Hook ”转换为阵列操作,而且我不明白为什么最后一个元素当我在递归调用中弹出它时,它没有从数组中删除。

这是程序:

peg_a = [1,0]
peg_b = []
peg_c = []

def hanoi(start,aux,target):
print(start,aux,target)
if len(start) == 1:
target.append(start.pop())
print(start,aux,target)
else:
hanoi(start[1:],target,aux)
target.append(start.pop())
print(start,aux,target)

hanoi(peg_a, peg_b, peg_c)

这是打印的内容:

[1, 0] [] []
[0] [] []
[] [] [0]
[1] [0] [0]

有什么帮助吗?

最佳答案

我认为一个问题是您的函数不返回任何内容。您使用列表来保存 bigs 的内容,它们是可修改的对象,因此您可以将函数参数视为指向这些对象的指针。这可能有效,但问题是通过使用 start[1:] 制作切片,您创建了一个新列表,因此它不再是指向原始列表的“指针”。

一种解决方法可能是仍然使用输入参数作为指向列表的指针,但不是添加一些额外的整数函数参数,这些参数指示要移动多少个磁盘。

我会这样做:

def hanoi(pegs, start, target, n):
assert len(pegs[start]) >= n, 'not enough disks on peg'
if n == 1:
pegs[target].append(pegs[start].pop())
print '%i -> %i: %s' % (start, target, pegs)
else:
aux = 3 - start - target # start + target + aux = 3
hanoi(pegs, start, aux, n-1)
hanoi(pegs, start, target, 1)
hanoi(pegs, aux, target, n-1)

我不使用 3 个不同的列表,因为在您的代码中它们会被交换,因此很难想象正在发生的事情。相反,我有一个 pegs 变量,它是一个列表列表。在我的例子中,starttarget 是我交换的钉子的索引。好消息是您现在可以打印各个步骤。快速演示:

pegs = [[4, 3, 2, 1], [], []]
hanoi(pegs, 0, 1, 4)

结果

0 -> 2: [[4, 3, 2], [], [1]]
0 -> 1: [[4, 3], [2], [1]]
2 -> 1: [[4, 3], [2, 1], []]
0 -> 2: [[4], [2, 1], [3]]
1 -> 0: [[4, 1], [2], [3]]
1 -> 2: [[4, 1], [], [3, 2]]
0 -> 2: [[4], [], [3, 2, 1]]
0 -> 1: [[], [4], [3, 2, 1]]
2 -> 1: [[], [4, 1], [3, 2]]
2 -> 0: [[2], [4, 1], [3]]
1 -> 0: [[2, 1], [4], [3]]
2 -> 1: [[2, 1], [4, 3], []]
0 -> 2: [[2], [4, 3], [1]]
0 -> 1: [[], [4, 3, 2], [1]]
2 -> 1: [[], [4, 3, 2, 1], []]

关于python - 尝试用数组实现递归的汉诺塔算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27581683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com