本人在用python计算同分异构体数量的时候遇到了类似问题。原因是,递归逻辑导致总是重复计算前面已经算过的内容。
例如,计算Fib(5)的时候,需要先算出Fib(3)和Fib(4),但算出Fib(3)后,在计算Fib(4)=Fib(2)+Fib(3)的时候,又计算了一次Fib(3).
(图片来自使用缓存方式优化递归函数与lru_cache - sfencs - 博客园)
这样下去,到计算Fib(100)的时候,就至少需要计算两次Fib(98),而计算Fib(98)又至少需要计算两次Fib(96),时间复杂度为指数级,所以程序短时间内无法完成。
有一个简单的解决方案:使用lru_cache缓存装饰器,缓存一些中间结果:
from functools import lru_cache @lru_cache(maxsize=1024) # 缓存斐波那契函数已经计算出的结果,最多占用1024字节内存 def fibn(n): if n == 0: return 1 elif n == 1: return 1 else: return fibn(n-1) + fibn(n-2) print(fibn(100)) # 求第100项的值,可瞬间计算出来