河内塔用辅助值解决

时间:2018-03-10 02:50:29

标签: python

当我拥有源数组中的所有值时,我编写的这段代码确实解决了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

1 个答案:

答案 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)可能有意义,但它可以移动您想要的列表中的任何值(您不需要移动整个堆栈)。