【发布时间】:2013-10-17 09:08:14
【问题描述】:
当一个函数使用多个递归调用时,我想指出一个可以更好地解释递归的参考。我想我知道当函数使用单个递归实例时 Python 如何处理内存。当函数处理数据时,我可以使用打印语句来跟踪数据在任何给定点的位置。然后,我可以往回走每一步,看看结果返回值是如何实现的。
一旦在单个函数调用期间触发了多个递归实例,我就不再确定数据的实际处理方式。先前使用恰当的打印语句的启发性方法揭示了一个看起来很量子的过程,或者至少更像巫术。
为了说明我的困惑,这里有两个基本示例:斐波那契塔和河内塔问题。
def getFib(n):
if n == 1 or n == 2:
return 1
return getFib(n-1) + getFib(n-2)
斐波那契示例具有两个内联调用。 getFib(n-1) 是否首先在整个堆栈中解析,然后 getFib(n-2) 类似解析,每个结果都被放入新的堆栈中,这些堆栈逐行相加,这些总和作为结果的总和?
def hanoi(n, s, t, b):
assert n > 0
if n ==1:
print 'move ', s, ' to ', t
else:
hanoi(n-1,s,b,t)
hanoi(1,s,t,b)
hanoi(n-1,b,t,s)
Hanoi 提出了一个不同的问题,因为函数调用在连续的行中。当函数到达第一个调用时,它是否将其解析为 n=1,然后移动到已经是 n=1 的第二个调用,然后到第三个直到 n=1?
再次,只是寻找可以帮助我了解这里发生的事情的参考资料。我敢肯定,在这种情况下解释起来可能有点多。
【问题讨论】:
-
我认为第一个函数将永远递归
n=<0 -
我不明白你的问题。特别是“
getFib(n-1)是否首先通过堆栈解决,然后getFib(n-2)以类似方式解决,每个结果都被放入新堆栈中,并且这些堆栈逐行添加在一起,这些总和被总计为结果?”这是什么意思?getFib(n-1)被评估,这意味着解释器执行所有代码,直到它收到它的返回值。该代码恰好包含对getFib的其他调用。
标签: python function recursion stack fibonacci