Python 有人能给我解释一下这是怎么回事吗;字典;斐波那契序列的版本有效吗?

Python 有人能给我解释一下这是怎么回事吗;字典;斐波那契序列的版本有效吗?,python,dictionary,fibonacci,Python,Dictionary,Fibonacci,那么这本fib字典(记忆版)是如何翻译的呢。序列有效吗?我想#无论何时调用一个新参数(以前没有调用过)都需要一些时间来计算,就像递归版本一样。但它只是立即输出结果。那么这是否意味着所有的菲波。结果存储在python程序本身中,所以它的计算速度非常快,因为我们使用了dict.并将其命名为?这是的一个实现。字典将注册任何计算结果,以避免在使用相同参数调用函数时再次执行相同的工作 如果没有备忘录,函数将如下所示: known = {0:0, 1:1} def fibonacci(n):

那么这本fib字典(记忆版)是如何翻译的呢。序列有效吗?我想#无论何时调用一个新参数(以前没有调用过)都需要一些时间来计算,就像递归版本一样。但它只是立即输出结果。那么这是否意味着所有的菲波。结果存储在python程序本身中,所以它的计算速度非常快,因为我们使用了dict.并将其命名为?

这是的一个实现。字典将注册任何计算结果,以避免在使用相同参数调用函数时再次执行相同的工作

如果没有备忘录,函数将如下所示:

    known = {0:0, 1:1}

def fibonacci(n):
    if n in known:
        return known[n]
    result = fibonacci(n-1) + fibonacci(n-2)
    known[n] = result
    return result

print(fibonacci(4))
fibonacci(5)
    fibonacci(4)
        fibonacci(3)
            fibonacci(2)
                fibonacci(1)
                   return 1  # from dictionary
            fibonacci(1)
                return 1  # from dictionary
        fibonacci(2)
            return 1  # from dictionary
    fibonacci(3)
        return 2  # from dictionary
请注意(例如)
fibonacci(3)
是如何被调用两次的,对于这两个调用中的第二个调用,所有递归调用都会再次进行。总共,
fibonacci(2)
被重新计算了四次。通过使用字典版本,递归树不会执行双重工作:

fibonacci(5)
    fibonacci(4)
        fibonacci(3)
            fibonacci(2)
                fibonacci(1)
                   return 1
            fibonacci(1)
                return 1
        fibonacci(2)
            fibonacci(1)
                return 1
            fibonacci(0)
                return 0
    fibonacci(3)
        fibonacci(2)
            fibonacci(1)
               return 1
        fibonacci(1)
            return 1
    fibonacci(2)
        fibonacci(1)
            return 1
        fibonacci(0)
            return 0
调用
fibonacci(5)
后,字典将如下所示:

    known = {0:0, 1:1}

def fibonacci(n):
    if n in known:
        return known[n]
    result = fibonacci(n-1) + fibonacci(n-2)
    known[n] = result
    return result

print(fibonacci(4))
fibonacci(5)
    fibonacci(4)
        fibonacci(3)
            fibonacci(2)
                fibonacci(1)
                   return 1  # from dictionary
            fibonacci(1)
                return 1  # from dictionary
        fibonacci(2)
            return 1  # from dictionary
    fibonacci(3)
        return 2  # from dictionary
因此,如果稍后调用
fibonacci(6)
,递归树将不必深入到那么深:

{
    0: 0,
    1: 1,
    2: 1,
    3: 2,
    4: 3,
    5: 5
}

…结果将被添加到字典中。。。等。

已知的
字典缓存以前计算的结果。这种技术通常被称为“记忆化”。它递归地计算斐波那契数,并将每个输入的结果保存在dict中,如果可用,则使用dict中已经计算出的结果…?!尝试在
返回已知[n]
之前添加
打印(f“在缓存中查找fib({n})。找到值{known[n]})。
语句以查看它的操作。在缓存中查找fib(1)。找到值1。正在缓存中查找fib(0)。找到值0。在缓存中查找fib(1)。找到值1。在缓存中查找fib(2)。找到值1。3哦,那很有趣……就像给我讲历史一样