所以,我正在用Python开发我的河内塔算法,其中3个堆栈表示为列表。这是代码:
def move(stack, inter_stack, final_stack):
disk=stack.pop()
final_stack.append(disk)
print(stack, inter_stack, final_stack)
def moveDisks(n,start,end,inter):
if n==1:
move(start, inter, end)
else:
moveDisks(n-1,start,inter,end)
move(start, inter, end)
moveDisks(n-1,inter,end,start)
n = input("Enter the # of blocks: ")
n = int(n)
start=[]
inter=[]
end=[]
for i in range(n):
start=start+[n-i]
moveDisks(n,start,end,inter)
如果我在 n = 3 的情况下运行这段代码,Python 给我的结果如下:
[3, 2] [] [1]
[3] [1] [2]
[] [3] [2, 1]
[] [2, 1] [3]
[2] [3] [1]
[] [1] [3, 2]
[] [] [3, 2, 1]
在此输出中,可以清楚地看到堆栈顺序不正常。但是,如果我替换该行
print(stack, inter_stack, final_stack)
跟
print(start, inter, end)
代码以正确的顺序输出堆栈:
[3, 2] [] [1]
[3] [2] [1]
[3] [2, 1] []
[] [2, 1] [3]
[1] [2] [3]
[1] [] [3, 2]
[] [] [3, 2, 1]
考虑到两组变量携带相同的值,第二种方式仅使用全局变量,为什么会发生这种情况?
递归时,您将通过以下两个调用更改堆栈的含义:
moveDisks(n - 1, start, inter, end)
moveDisks(n - 1, inter, end, start)
请注意更改顺序。 因此在move()
print(stack, inter_stack, final_stack)
每次都会引用不同的列表。