河内塔 - 移动的元组

时间:2014-03-14 09:13:44

标签: python python-3.x

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)

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

我的方法是创建一个名为tup的全局变量,一个空元组。然后,每当创建新的元组移动时,它将被添加到tup。我的问题是我不知道什么时候应该返回tup的值以及hanoi函数里面我可以放return行的位置。

1 个答案:

答案 0 :(得分:1)

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

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)]