当前位置: 代码迷 >> python >> 河内塔-动作的元组
  详细解决方案

河内塔-动作的元组

热度:50   发布时间:2023-07-14 08:59:51.0
def hanoi(n,src,dsc,aux):
    if n == 1:
        print_move(src,dsc)
    else:
        hanoi(n-1,src,aux,dsc)
        print_move(src,dsc)
        hanoi(n-1,aux,dsc,src)

def print_move(src,dsc):
    print("Move the top disk from",src,"to",dsc)

我希望更改上面的hanoi代码塔,以输出一个元组移动,当按顺序执行该动作时,会将所有磁盘从源极通过辅助极移动到目标极。 磁盘移动定义为两个数字对:源极和目标极。 例如, (1, 3)表示磁盘从第一极移到第三极。 因此, hanoi(2,1,3,2)将输出((1,2),(1,3),(2,3))

我的方法是创建一个名为全局变量tup ,一个空的元组。 然后,无论何时创建新的元组移动,都会将其添加到tup 我的问题是我不知道何时应该返回tup的值以及在hanoi函数中可以放置return行的位置。

在递归函数中实现此目标的最佳方法通常是:

def hanoi(..., out=None):
    if out is None:
        out = [] # list to store output
    ...
    print_move(src, dsc)
    out.append((src, dsc)) # add result to output
    ...
    hanoi(..., out) # call recursively and ignore return
    ...
    return out # return output

(请注意,使用None可以避免使用默认参数可变的问题。)

并在致电时:

results = hanoi(...)

这样,单个列表out将被递归调用的所有级别共享并添加到列表中。 每个调用都会忽略更深层调用的返回值,因为它们仍然可以访问相同的列表,但是顶层的调用者会从所有级别取回输出。

列表比元组更好,这对于存储来说是个更好的主意,因为列表是可变的,但每次移动都使用两元组似乎是明智的:

results == [(1, 2), (1, 3), (2, 3)]
  相关解决方案