【发布时间】:2020-08-19 14:40:31
【问题描述】:
我正在处理codewars 中的一个问题,希望您记住斐波那契数列。到目前为止,我的解决方案是:
def fibonacci(n):
return fibonacci_helper(n, dict())
def fibonacci_helper(n, fib_nums):
if n in [0, 1]:
return fib_nums.setdefault(n, n)
fib1 = fib_nums.setdefault(n - 1, fibonacci_helper(n - 1, fib_nums))
fib2 = fib_nums.setdefault(n - 2, fibonacci_helper(n - 2, fib_nums))
return fib_nums.setdefault(n, fib1 + fib2)
对于较小的 n 值,它工作得相当好,但在超过 30 标记时会显着减慢,这让我想知道——这个解决方案甚至被记忆了吗?对于较大的 n 值,我如何才能使这种类型的解决方案足够快地工作?
【问题讨论】:
-
代码看起来不错。我似乎从这段代码中理解的唯一问题是 setdefault 函数,因为它首先查找密钥,然后如果找不到则将其放入字典中。不确定,但我猜执行可能会因为搜索而减慢。
-
你仍然有指数级的函数调用。
-
不,你正在记忆,但没有使用记忆!
-
感谢大家抽出宝贵时间发表评论!
标签: python fibonacci memoization