假设您想获得第 n 个斐波那契数。然后,一种可能性是使用递归函数
def Fib(n, d):
"""Assumes n is an int >= 0, d dictionary
Returns nth Fibonacci number"""
if n in d:
return d[n]
else:
d[n] = Fib(n-1, d) + Fib(n-2, d)
return d[n]
这工作得很好。我试图将其缩短为
def Fib(n, d):
return d.setdefault(n, Fib(n-1, d) + Fib(n-2, d))
但是当我可以用
d={0:1, 1:1}
print(f(2, d))
,或者甚至使用 f(1,d),它进入无限循环,并重新启动内核。事实上,这种形式的任何功能,比如说
def f(n, d):
return d.setdefault(n, f(n-1,d))
有同样的问题。当我尝试调试这个时,我看到 n 不断减小,通过值 1。我想我不明白这个方法的实现。我假设 setdefault 方法首先检查 key 是否在字典中并返回值,如果没有,则将默认值分配给 key 并返回默认值。我在这里缺少什么?(我使用 Python 3.9.1 和 Spyder 4.2.0)