让我试试:
从您的 sn-p 中,在每个函数调用中,即 foo(step+1) 一个称为激活记录的结构或
创建框架以存储有关该函数调用的进度的信息。
所以,当一个函数的执行导致一个嵌套的函数调用时,前一个调用的执行
被挂起,并且它的激活记录存储了源代码中控制流的位置
应在嵌套调用返回后继续。
这里是主要部分:
当 step == 4 时,依次为 range(4,4) == 空列表,该时间迭代不会发生,因此它将返回
没有。然后它将移动到上一帧,在那里它被停止并开始一个新的迭代和递归函数调用
直到范围(4,4)。
注意:递归基本情况仅在 step == 4 时,即时间范围 (4,4) 并返回 None。
每个recusion都需要一个基本情况,否则它将进入无限循环。
所以,让我们看看递归跟踪:我添加i 以区分step 和迭代增量。
# 1 def foo(step=0):
# 2 for i in range(step, 4):
# 3 print 'i: %d, step: %d' % (i,step)
# 4 foo(step+1)
# 5 foo()
line 5
line 1 foo with step=0 which is default
line 2 range(0,4) Frame: A, 0 is over, next=1
line 3 step = 0 Output: i: 0, step: 0
line 4 calling foo(0 + 1)
line 1 foo with step=1
line 2 range(1,4) Frame: B, 1 is over, next=2
line 3 step = 1 Output: i: 1, step: 1
line 4 calling foo(1 + 1)
line 1 foo with step=2
line 2 range(2,4) Frame: C, 2 is over, next=3
line 3 step = 2 Output: i: 2, step: 2
line 4 calling foo(2 + 1)
line 1 foo with step=3
line 2 range(3,4) Frame: D, 3 is over, next=4
line 3 step = 3, Output: i: 3, step: 3
line 4 calling foo(3 + 1)
line 1 foo with step=4
line 2 range(4,4) Frame: E,
This is an empty list, so it won't come inside the loop, so return None.
Come back to previous Frame: D, i=3 was used, now increment to 4. So, again range(4,4)
line 2 range(4,4) Empty list, from Frame: D, return None
Come back to previous Frame C, now i=3, step was called with value 2
line 2 range(2,4)
line 3 step = 2 Output: i: 3, step: 2, why step == 2 because the function foo was called with step=2
line 4 calling foo(2 + 1)
line 1 foo with step=3
line 2 range(3,4)
line 3 step = 3, Output : i: 3, step: 3
line 4 calling foo(3 + 1)
line 1 foo with step=4
line 2 range(4,4) Empty list again, not going inside the list, return None
line 2 range(2,4) From Frame: B, step was == 1, because the function foo was called with step=1
line 3 step: 1 Output: i: 2, step: 1, here i ==2, because this is the second iteration of Frame B.
line 4 calling foo(1 + 1)
line 1 foo with step=2
line 2 range(2,4)
line 3 step: 2 Output: i: 2, step: 2
在此之后,它遵循相同的递归方式,直到迭代范围耗尽,即 range(4,4)
如果有帮助,请告诉我。