【发布时间】:2019-10-28 10:22:54
【问题描述】:
我编写这段代码是为了从中序遍历和后序遍历创建二叉树,但我偶然发现了一个令人困惑的递归解决方案,因为该程序的行为类似于尾递归调用,而不是标准递归。
我已将代码转换为通用的代码,以便每个人都更容易理解
class Test:
def func(self, array):
if not array:
return 0
print(array)
array.pop(0)
temp1 = self.func(array)
temp2 = self.func(array)
x = [1,2,3,4,5,6]
temp = Test()
temp.func(x)
我希望 2 个函数调用两次具有相同的输出。那就是第一次调用应该导致[2,3,4,5,6],[3,4,5,6] ... [6]。第二个函数调用应该做同样的事情。相反,第二次调用没有发生任何事情。递归堆栈不应该保存数组的当前状态,为什么要更新?
【问题讨论】:
-
当第二个
self.func()被调用时,第一个(及其递归子代)已经吃掉了整个数组。 -
堆栈不包含整个数组(即列表)的副本。它包含对它的引用。只有一份清单。对它的任何机会都会反映在对它的所有引用中。