【发布时间】: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_cachestackoverflow.com/a/14731729/4541045 .. 文档实际上展示了它围绕斐波那契数列的使用 docs.python.org/3/library/functools.html#functools.lru_cache -
作为补充阅读 - 查看functools.lru_cache
标签: python function recursion memory return-value