4

我想指出一个参考,当一个函数使用多个递归调用时,它可以更好地解释递归。我想我知道当函数使用单个递归实例时 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)

河内提出了一个不同的问题,因为函数调用是连续的。当函数到达第一个调用时,它是否将其解析为 n=1,然后移动到已经是 n=1 的第二个调用,然后到第三个直到 n=1?

再次,只是寻找可以帮助我了解这里发生的事情的参考资料。我敢肯定,在这种情况下解释起来可能有点多。

4

1 回答 1

4

http://www.pythontutor.com/visualize.html

那里甚至还有一个 Hanoi 链接,因此您可以按照代码流进行操作。

这是他们在其网站上显示的 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

于 2013-10-09T20:20:04.030 回答