我想指向一个可以在函数使用多个递归调用时更好地解释递归的引用。我认为当函数使用单个递归实例时,我会得到Python处理内存的方式。在函数处理数据时,我可以使用print语句来跟踪数据在任何给定点的位置。然后我可以回过头来看看每个步骤是如何实现的。
在单个函数调用期间,一旦多个递归实例被触发,我不再确定数据是如何实际处理的。以前很有说服力的印刷语句方法揭示了一个看起来很有量的过程,或者至少更像是伏都教。
为了说明我的困境,这里有两个基本的例子:斐波纳契和河内塔问题。
def getFib(n):
if n == 1 or n == 2:
return 1
return getFib(n-1) + getFib(n-2)
Fibonacci示例包含两个内联调用。 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)
类似地解析,每个结果都被放入新的堆栈中,并且这些堆栈逐行加在一起,这些总和被合计为导致?
{{1}}
Hanoi提出了一个不同的问题,因为函数调用是连续的。当函数到达第一个调用时,是否将其解析为n = 1,然后移动到已经n = 1的第二个调用,然后移到第三个调用,直到n = 1?
再一次,只是寻找可以帮助我了解这里发生的事情的参考资料。我确信在这种情况下可能需要解释一下。
答案 0 :(得分:2)
http://www.pythontutor.com/visualize.html
那里甚至还有一个Hanoi链接,因此您可以按照代码流程进行操作。
这是他们在网站上显示的河内代码的链接,但可能需要进行调整以显示您的确切代码。
http://www.pythontutor.com/visualize.html#code=%23+move+a+stack+of+n+disks+from+stack+a+to+stack+b,%0A%23+using+tmp+as+a+temporary+stack%0Adef+TowerOfHanoi(n,+a,+b,+tmp)%3A%0A++++if+n+%3D%3D+1%3A%0A++++++++b.append(a.pop())%0A++++else%3A%0A++++++++TowerOfHanoi(n-1,+a,+tmp,+b)%0A++++++++b.append(a.pop())%0A++++++++TowerOfHanoi(n-1,+tmp,+b,+a)%0A++++++++%0Astack1+%3D+%5B4,3,2,1%5D%0Astack2+%3D+%5B%5D%0Astack3+%3D+%5B%5D%0A++++++%0A%23+transfer+stack1+to+stack3+using+Tower+of+Hanoi+rules%0ATowerOfHanoi(len(stack1),+stack1,+stack3,+stack2)&mode=display&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=2&curInstr=0