Python中具有递归函数的if语句的逻辑

时间:2018-07-26 19:55:27

标签: python if-statement recursion data-structures

我具有以下简单的递归函数:

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中递归功能和条件语句的不同角度。

4 个答案:

答案 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')