递归调用的return语句如何在Python中保存中间值?

时间:2017-08-19 01:07:34

标签: python recursion return-value

正在审查一些与递归调用相关的python代码,并注意到return语句看起来很有趣。如果在下一个递归调用的return语句中没有变量赋值,递归如何工作?

在进行递归调用时,中间求和的值不会存储在显而易见的位置。调试器似乎显示每个调用减少一个列表,但我不知道中间值的存储位置。

另一个有趣的事情是调试器似乎在最后一次调用后最后一次遍历值。使用PyCharm,但不确定是否重要。

在后续递归中,return语句如何在递归调用期间保存求和值?

def sum_list(list_of_num):
    if len(list_of_num) == 1:
        return list_of_num[0]
    else:
        return list_of_num[0] + sum_list(list_of_num[1:])

print(sum_list([4,6,7,3,7,3,2]))

2 个答案:

答案 0 :(得分:5)

该函数将值返回到调用堆栈中较高的调用,为什么您认为它需要一个变量,例如采取简单的递归调用:

def r(n):
    if n == 0:
         return 0
    return 1 + r(n-1)

然后调用堆栈看起来像:

r(3):
    return 1 + r(2)
    r(2):
        return 1 + r(1)
        r(1):
            return 1 + r(0)
            r(0):
                return 0

因此,当你解开调用堆栈时,你会得到:

r(3):
    return 1 + r(2)
    r(2):
        return 1 + r(1)
        r(1):
            return 1 + 0
--
r(3):
    return 1 + r(2)
    r(2):
        return 1 + 1
--
r(3):
    return 1 + 2
--
3

答案 1 :(得分:0)

正如AChampion解释的那样,如果你想在Pycharm中看到相同类型的代码堆栈跟踪,请执行几个步骤。

在Pycharm中选择

Show return values

然后您可以在调试每个步骤时看到如何添加调用堆栈以及操作完成后如何返回值

Call stack return value