gpt4 book ai didi

python - 递归 Think Python 2 练习 5.5

转载 作者:行者123 更新时间:2023-12-01 03:39:41 25 4
gpt4 key购买 nike

有关 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 后很长时间内继续执行工作(两次!)。我显然在这里遗漏了一个关键概念,并且希望任何人都能就这个主题提供任何启发。先谢谢了~

最佳答案

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

如果您不熟悉调用堆栈是什么,请将其视为函数堆栈 - 每当调用某些内容时,它就会被放置在堆栈顶部,这就是正在运行的内容。当它返回时,它会从堆栈中删除,因此调用它的函数(堆栈中下面的一个)现在位于顶部,因此执行会再次开始。

当 n == 0 (所以这是你的基本情况)时,该特定函数将返回,因此一旦它的递归调用 draw(t, length, n-1) - 因此,它的后续的递归调用,因为在它们完成之前它不会完成执行 - 到达该点,它将移至下一行。

采用更简单的函数 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) 移动,直到该调用和所有递归调用返回为止。该函数在结构上与您展示的函数相当,它可能会帮助您更好地可视化正在发生的事情。

关于python - 递归 Think Python 2 练习 5.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39814341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com