【问题标题】:Does return keyword in Python saves the value in memory for a function with an specific parameter?Python中的return关键字是否将具有特定参数的函数的值保存在内存中?
【发布时间】:2021-01-15 19:29:20
【问题描述】:

我正在学习递归函数,我有一个疑问,比如说:

def fibonacci(n):
if n == 0 or n == 1:
    return 1

return fibonacci(n-1) + fibonacci(n-2)

fibonacci(4)
fibonacci(5)

当程序执行fibonacci(5)时,会是这样的:

fibonacci(5) = fibonacci(4) + fibonacci(3)

Python 是否必须使用递归再次计算最后两个函数,或者它是否已经将结果保存在内存中,因为它在执行fibonacci(4) 时已经使用相同的参数执行了相同的函数,因此会立即为它们分配它们的价值观?

【问题讨论】:

  • "Python 是否必须使用递归再次计算最后两个函数" 是的,当然。这还能怎么做?您希望 Python 缓存默认情况下每个函数调用的结果?除非它们是纯函数,否则这在原则上是不可取的,甚至没有考虑到内存需求。
  • 无论如何,你有没有尝试这个,例如将print 放入您的fibonacci 函数中,看看会发生什么?
  • 您可能正在寻找记忆 en.wikipedia.org/wiki/Memoization ,尽管还有许多其他出色的优化来计算斐波那契数列!
  • 这提供了 functools.lru_cache stackoverflow.com/a/14731729/4541045 .. 文档实际上展示了它围绕斐波那契数列的使用 docs.python.org/3/library/functools.html#functools.lru_cache
  • 作为补充阅读 - 查看functools.lru_cache

标签: python function recursion memory return-value


【解决方案1】:

首先,Python 中的函数调用没有自动缓存。如果你调用fibonacci(6),然后调用fibonacci(5),Python 将再次调用所有关联的函数,即使它是多余的。

您所说的(缓存等)称为memoization,是称为动态编程的更大概念的基本原则。 DP 基本上是一种采用基本递归(如您的斐波那契实现)并通过应用一些技术(如缓存)使其更高效的方法

这是一个很好的网站,它很好地解释了这个概念,并且实际上以斐波那契数列为例。 What is Dynamic Programming

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2021-03-18
    • 2011-11-13
    • 2019-03-31
    • 2015-10-16
    • 2015-12-27
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多