我具有以下简单的递归函数:
def draw_interval(center_length):
if center_length > 0:
print('first value: {}'.format(center_length))
draw_interval(center_length - 1)
print('second value: {}'.format(center_length))
draw_interval(3)
,输出为:
first value: 3
first value: 2
first value: 1
second value: 1
second value: 2
second value: 3
我的问题是为什么会这样,即使draw_interval(center_length - 1)
是
假。我已经看过similar question,但是我的问题指向Python中递归功能和条件语句的不同角度。
答案 0 :(得分:3)
这是函数的递归方式:
draw_interval(3):
center_length > 0 is true
"first value 3"
draw_interval(2):
center_length > 0 is true
"first value 2"
draw_interval(1):
center_length > 0 is true
"first value 1"
draw_interval(0):
center_length > 0 is FALSE: no more calls to `draw_interval` are made
execution returns to draw_interval(1)
"second value 1"
execution returns to draw_interval(2)
"second value 2"
execution returns to draw_interval(3)
"second value 3"
execution returns to the end of your program
在draw_interval(center_length - 1)
为False后,它不会运行center_length > 0
。
答案 1 :(得分:1)
您似乎希望输出在输出的前三行之后停止。
尽管if
主体没有第四次执行,但是整体执行不会停止。仍然有一个不为空的调用堆栈。那个特定的函数调用(没有执行if
块),返回到调用它的函数的执行上下文中,这仍然有事情要做。即,它应该打印“第二个值” ...,然后返回到调用它的位置,例如...
请注意,当一个函数被调用时(也许是在一个函数内-可能是同一函数),一旦该函数返回,调用代码将恢复。在您的情况下,代码将在if
块内返回,该块不会重新评估条件,就像之前已经做过的那样。因此,即使center_length
变为0,也不会影响调用代码的执行位置。
此外,每个函数执行上下文都有其自己的单独的center_length
变量。因此,即使传递的次数少一点,也不会影响调用函数中的center_length
值。这个事实不会影响您的情况下的执行顺序,但可以帮助您掌握递归。
答案 2 :(得分:1)
让我们逐步运行代码-
def draw_interval(center_length):
if center_length > 0:
print('first value: {}'.format(center_length))
draw_interval(center_length - 1)
print('second value: {}'.format(center_length))
draw_interval(3)
print('first value: {}'.format(center_length)) comes here,
prints 3
draw_interval(center_length - 1) => draw_interval(2) called
1. print('second value: {}'.format(center_length)) stays in memory because draw_interval() called with 2
draw_interval(2)
print('first value: {}'.format(center_length)) comes here,
prints 2
2. print('second value: {}'.format(center_length)) stays in memory because draw_interval() called with 1
draw_interval(1)
print('first value: {}'.format(center_length)) comes here,
prints 1
3. print('second value: {}'.format(center_length)) stays in memory because draw_interval() called with 0
条件为假 解开步骤3、2、1打印1、2、3
有意义的希望
答案 3 :(得分:0)
之所以如此,是因为递归会创建嵌套函数,并从上到下依次以相反的顺序返回。这是我的意思:
draw_interval(3):
if 3 > 0:
print('first: ', 3)
if 2 > 0:
print('first: ', 2)
if 1 > 0:
print('first: 1')
if 0 > 0: # this doesn't pass
print('first: 0')
print('second: 0')
print('second: 1')
print('second: 2')
print('second: 3')