当我拥有源数组中的所有值时,我编写的这段代码确实解决了hanoi问题。但是,当它在辅助数组中的值中途解决时,它似乎无法工作。
我如何以这样的方式对其进行编码,以便检查辅助数组是否具有值并从那里开始工作。递归函数当前在源为空后运行一次
# Source, helper, target are arrays. n = height
def solve(n, source, helper, target):
if n > 0:
# First we move a tower of size n-1 from the peg source to the helper peg.
solve(n - 1, source, target, helper)
if source:
# Move the largest disk to the target
target.append(source.pop())
# Move the tower from helper to target
solve(n - 1, helper, source, target)
source = [4]
target = []
helper = [3,2,1]
solve(len(source),source,helper,target)
print source, helper, target
答案 0 :(得分:0)
正如您所注意到的,只有所有值都在source
列表中时,您当前的代码才有效。正如jasonharper在注释中指出的那样,它实际上从未查看列表中的值,它只是遵循适用于正常启动配置的模式。
如果您从部分解决的电路板开始,或者更糟糕的是随机重新排列的电路板,您需要检查列表的内容,以便找出需要完成的额外工作。这是一个我觉得应该有效的解决方案,只要你的列表包含从1
增加到最大值的整数:
def solve(n, source, helper, dest):
assert(n in source) # precondition
for x in range(n - 1, 0, -1): # this loop does nothing if n=1, so we don't need to check
if x in source:
solve(x, source, dest, helper)
break
elif x in dest:
solve(x, dest, source, helper)
break
# at this point all values smaller than n will be in the helper list
dest.append(source.pop())
if n > 1:
solve(n - 1, helper, source, dest)
# postcondition: all values from n down to 1 are in dest
n
值必须是您要移动的最大值,因此如果某些值位于其他列表中,则使用len(source)
获取它将是错误的。使用max(source)
可能有意义,但它可以移动您想要的列表中的任何值(您不需要移动整个堆栈)。