Python 使用dict.get()的斐波那契级数和递归错误
我使用下面的代码来计算斐波那契级数的一个元素。 代码按原样正常工作Python 使用dict.get()的斐波那契级数和递归错误,python,python-3.x,dictionary,recursion,Python,Python 3.x,Dictionary,Recursion,我使用下面的代码来计算斐波那契级数的一个元素。 代码按原样正常工作 def fib(n, lookup=dict()): if n == 0 or n == 1: lookup[n] = n # This works if n not in lookup: # However, this doesn't # if not lookup.get(n): lookup[n] = fib(n - 1, lookup) + f
def fib(n, lookup=dict()):
if n == 0 or n == 1:
lookup[n] = n
# This works
if n not in lookup:
# However, this doesn't
# if not lookup.get(n):
lookup[n] = fib(n - 1, lookup) + fib(n - 2, lookup)
return lookup[n]
print(fib(6))
现在,如果我使用
如果不查找。获取(n):
而不是:
如果n不在查找中:
我得到一个递归错误,即使我只计算第6个元素!:
RecursionError: maximum recursion depth exceeded in comparison
为什么会出现此错误
lookup.get(0) -> 0
0 in lookup -> True
0是一个“falsey”值,当您得到一个falsey值时,您会递归,因此带有
get
的版本会导致您在达到0时无限递归(由于您没有对其进行检查,因此递归为无限负值)。解决方案是使用if lookup.get(n)不是None
,因为这是默认情况下错过的get返回的结果。如果n不在查找中,IMO将使用更具python风格的解决方案。为什么混淆?:)如果lookup.get(n)在本例中为None,则为。谢谢。@SamStafford我同意,我只是想知道为什么我用它得到了不同的结果。得到这种错误基本上是因为Python风格的指导原则不鼓励依赖非bool类型的“真实性”。也就是说,不要使用其他东西作为
中的代理,也不要使用truthy检查作为不是无的代理(
)