问题描述
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
行的位置。
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)]