对于一项任务,我们被要求定义一个斐波那契函数,我完成了这个:
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
但是,我已经看到了递归函数,例如factorial函数,在一行返回语句中定义如下:
def factorial(n):
return n > 1 and n * factorial(n-1) or 1
所以,我试图将其应用于我的斐波那契函数。经过几次尝试后,我得到它适用于所有测试用例,除非s = 0,在这种情况下,当它应该返回0时返回False。这就是我的位置:
def fibonacci(n):
return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))
我理解python将0计算为False,那么当n为0时,如果保持代码的当前长度/结构,我将如何使python返回零而不是False?这甚至可能吗?
此外,这种创建函数(递归或其他)的风格是否比教科书版本更好或更不可取/ pythonic? (我想象的不仅仅是因为可读性)
要说清楚,我已经满足了作业的要求,而且仅仅为了个人知识,我希望更清楚地了解回报声明中发生的事情。
答案 0 :(得分:10)
如果x and y or z
为falsy,则y
成语不起作用。您可以交换条件以使其工作:
def fibonacci(n):
return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n
但是,从Python 2.5(6年前发布)开始,我们已经有了conditional expressions,并且不再需要and/or
黑客攻击了:
def fibonacci(n):
return n if n < 2 else fibonacci(n-1) + fibonacci(n-2)
现在这具有指数运行时复杂性。如果您想提高效率,请使用O(n)
算法:
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
甚至可以编写一个生成器来生成所有数字,只需要尽可能多的数据。
答案 1 :(得分:1)
也许这使得它更清晰:
def fibonacci(n):
print ((n == 0 or n == 1) and n)
print (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))
return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))
print 0 or False
print False or 0