谁能给我解释一下这个 "Dictionary" 版本的斐波那契数列是如何工作的?
Can someone explain to me how this "Dictionary" version of Fibonacci sequence works?
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))
那么fib的这本词典(背诵版)怎么样呢?序列有效?我认为 #whenever 我们调用一个新参数(以前没有调用过)需要一些时间来计算,就像递归版本一样。但它只是立即输出结果。这是否意味着所有斐波那契。结果存储在 python 程序本身中,所以它的计算速度非常快,因为我们使用了 dict。并称之为?
这是 memoization 的实现。字典将记录任何计算结果,以避免在使用相同参数调用函数时必须再次完成相同的工作。
如果没有记忆,该函数将如下所示:
def fibonacci(n):
if n < 2:
return n
result = fibonacci(n-1) + fibonacci(n-2)
return result
然后调用 fibonacci(5)
将导致对函数的这些调用:
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(3)
是如何被调用两次的,并且对于这两次调用中的第二次调用,所有递归调用都会再次进行。总共 fibonacci(2)
被重新计算了四次。通过使用字典版本,递归树将不会做双重工作:
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(5)
后字典将如下所示:
{
0: 0,
1: 1,
2: 1,
3: 2,
4: 3,
5: 5
}
因此,如果稍后调用 fibonacci(6)
,递归树将不必那么深:
fibonacci(6)
fibonacci(5)
return 5 # from dictionary
fibonacci(4)
return 3 # from dictionary
...结果将被添加到字典中...等等
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))
那么fib的这本词典(背诵版)怎么样呢?序列有效?我认为 #whenever 我们调用一个新参数(以前没有调用过)需要一些时间来计算,就像递归版本一样。但它只是立即输出结果。这是否意味着所有斐波那契。结果存储在 python 程序本身中,所以它的计算速度非常快,因为我们使用了 dict。并称之为?
这是 memoization 的实现。字典将记录任何计算结果,以避免在使用相同参数调用函数时必须再次完成相同的工作。
如果没有记忆,该函数将如下所示:
def fibonacci(n):
if n < 2:
return n
result = fibonacci(n-1) + fibonacci(n-2)
return result
然后调用 fibonacci(5)
将导致对函数的这些调用:
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(3)
是如何被调用两次的,并且对于这两次调用中的第二次调用,所有递归调用都会再次进行。总共 fibonacci(2)
被重新计算了四次。通过使用字典版本,递归树将不会做双重工作:
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(5)
后字典将如下所示:
{
0: 0,
1: 1,
2: 1,
3: 2,
4: 3,
5: 5
}
因此,如果稍后调用 fibonacci(6)
,递归树将不必那么深:
fibonacci(6)
fibonacci(5)
return 5 # from dictionary
fibonacci(4)
return 3 # from dictionary
...结果将被添加到字典中...等等