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
行的位置。
答案 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)]