【问题标题】:How does return statement with recursion calls hold intermediate values in Python?带有递归调用的 return 语句如何在 Python 中保存中间值?
【发布时间】:2017-08-19 01:07:33
【问题描述】:

正在查看一些与递归调用相关的 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]))

【问题讨论】:

  • 这与您在非递归表达式中调用的函数没有什么不同。结果是首先分配给变量还是在没有这种分配的情况下返回并不重要,因为表达式在分配给变量之前以相同的方式计算。

标签: python recursion return-value


【解决方案1】:

函数将值返回给调用堆栈中更高的调用,为什么你认为它需要一个变量,例如进行简单的递归调用:

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

【讨论】:

  • 谢谢!从调用堆栈的角度来看它以及它如何展开真的很有帮助。感谢您的解释。
【解决方案2】:

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

在 Pycharm 中选择

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

【讨论】:

  • 感谢您向我展示了如何配置 pycharm 来识别返回值!我意识到我在帖子中提出了一些问题,非常感谢您在 pycharm 方面的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多