【问题标题】:Multi-recursive functions多递归函数
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 可能是我,但这似乎没有帮助。 :)
  • 感谢 Garth,视觉表现非常有帮助。
  • 是的,它并不适合所有人,但它确实可以同时显示堆栈和所有内容。只是另一种看待它的方式。
猜你喜欢
  • 2015-03-01
  • 1970-01-01
  • 2013-01-15
  • 2010-12-23
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多