从 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 返回列表的主要内容,如果未能解决你的问题,请参考以下文章

1021 Fibonacci Again

一只小蜜蜂 ycb与取款机 yzm10铺瓷砖-Fibonacci数列

14Fibonacci的两种实现方式

Nowcoder 105D Fibonacci 进制 (数论)

Nowcoder 105D Fibonacci 进制 (数论)

Nowcoder 105D Fibonacci 进制 (数论)