从 0 到 N 的 Fibonacci Memoization 返回列表
Posted
技术标签:
【中文标题】从 0 到 N 的 Fibonacci Memoization 返回列表【英文标题】:Fibonacci Memoization return list from 0 to N 【发布时间】:2021-12-28 03:48:21 【问题描述】:def fib(n, memo: Dict = ):
if n == 0 or n == 1:
return n
if n not in memo:
memo[n] = fib(n-2, memo)+fib(n-1, memo)
return memo[n]
我有这个使用记忆的函数,它返回斐波那契数列的 第 n 位。如何修改此函数以使其返回从第 0 到第 N 斐波那契序列的值列表?我还是想用memoization。
输入:10
当前输入:55
想要的输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
编辑:此解决方案有效
from typing import Dict, List
def fib(n, res: List = [], memo: Dict = ):
fib_helper(n, res, memo)
if n >= 1:
res.insert(1, 1)
if n >= 0:
res.insert(0, 0)
return res
def fib_helper(n, res, memo):
if n == 0 or n == 1:
return n
if n not in memo:
memo[n] = fib_helper(n-2, res, memo)+fib_helper(n-1, res, memo)
res.append(memo[n])
return memo[n]
【问题讨论】:
为什么不只是:[fib(i) for i in range(11)]
。 (虽然在这里使用记忆的斐波那契很浪费——你可以迭代地生成斐波那契数并建立一个列表)。
【参考方案1】:
如下向该函数传递一个dict:
mydict=
fib(10,mydict)
list(mydict.values())
如果你没有得到 0 或 1,修改如下。 修改后的代码输出。
>>> def fib(n, memo):
... if n == 0 or n == 1:
... memo[n] = n
... return n
... if n not in memo:
... memo[n] = fib(n-2, memo)+fib(n-1, memo)
... return memo[n]
...
>>> mydict =
>>> fib(10, mydict)
55
>>> list(mydict.values())
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
【讨论】:
有效,但未准确显示预期输出 修改函数如下: if n == 0 or n == 1: memo[n] = n return n【参考方案2】:没有递归会更容易。
memo = [0, 1]
def fib(n): # n is a non-negative int
n += 1 # 0 to n incl. is [0:n+1]
missing = n - len(memo)
if missing > 0:
a, b = memo[-2:]
for _ in range(missing):
a, b = b, a+b
memo.append(b)
return memo[:n]
print(fib(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
【讨论】:
【参考方案3】:利用functools.lru_cache
提供的功能(您应该在某处检查您的输入是否为非否定):
import functools
@functools.lru_cache()
def fibonacci(n):
return int(n > 0) if n <= 2 else fibonacci(n-1) + fibonacci(n-2)
your_input = 10
print([fibonacci(x) for x in range(your_input + 1)])
【讨论】:
这会返回一个整数,但我想要一个列表。检查预期输出 @PaoloTormon 指出。你的输入是 10 还是 55?以上是关于从 0 到 N 的 Fibonacci Memoization 返回列表的主要内容,如果未能解决你的问题,请参考以下文章
一只小蜜蜂 ycb与取款机 yzm10铺瓷砖-Fibonacci数列
Nowcoder 105D Fibonacci 进制 (数论)