递归Think Python 2练习5.5

时间:2016-10-02 06:07:52

标签: python python-3.x recursion

关于来自Think Python 2的练习5.5的这个问题已经asked and answered already,但我仍然不了解这个功能是如何工作的。这是有问题的功能:

def draw(t, length, n):
    if n == 0:
        return
    angle = 50
    t.fd(length*n)
    t.lt(angle)
    draw(t, length, n-1)
    t.rt(2*angle)
    draw(t, length, n-1)
    t.lt(angle)
    t.bk(length*n)

我在这里看到一个递归循环:

def draw(t, length, n):
    if n == 0:
        return
    angle = 50
    t.fd(length*n)
    t.lt(angle)
    draw(t, length, n-1)

在函数调用自身足够多次以使n == 0之后,它如何继续下一步,即t.rt(2 * angle)?一旦n == 0,该函数是否应该返回None并简单地结束?如果没有,返回的地方?下次调用自身时会再次发生同样的事情,然后在满足状态n == 0(两次!)后,函数继续执行工作。我在这里显然错过了一个关键概念,并且会欣赏任何人都能在这个主题上留下的任何亮点。提前谢谢〜

2 个答案:

答案 0 :(得分:1)

return语句将程序的执行返回到调用返回函数的行。

如果您不熟悉调用堆栈的内容,可以将其视为一堆函数 - 无论何时调用某些内容,它都会置于堆栈顶部并且它是什么&&#39 #39;正在运行。当它返回时,它会从堆栈中删除,因此调用它的函数(堆栈中的一个函数)现在是顶部,因此执行会再次启动。

当n == 0时,该特定函数将返回(因此这是你的基本情况),所以一旦它的递归调用draw(t, length, n-1) - 并且因此它的后续递归调用,因为它赢了&# 39;完成执行直到他们这样做 - 到达那一点,它将移动到下一行。

改为使用更简单的函数foo(sum, n)

def foo(sum, n):
    if (n == 0):
        return sum
    sum += foo(sum, n-1)
    sum /= 2
    return foo(sum, n-1)

每当你打电话给它时,它都不会从sum += foo(sum, n-1)移动直到那个电话和所有递归的电话都返回。这个功能在结构上与你展示的功能相当,它可以帮助你更好地想象一下正在发生的事情。

答案 1 :(得分:1)

我已在以下question发布了一张图片解释此内容,以便在此快速导航我的照片:

Explanation