Ver*_*int 4 python syntax return return-value
对于作业,我们被要求定义一个斐波纳契函数,我用这个完成了:
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
Run Code Online (Sandbox Code Playgroud)
但是,我已经看到了递归函数,例如在一行返回语句中定义的阶乘函数,如下所示:
def factorial(n):
return n > 1 and n * factorial(n-1) or 1
Run Code Online (Sandbox Code Playgroud)
所以,我试图将其应用于我的斐波那契函数.经过几次尝试后,我得到它适用于所有测试用例,除非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)))
Run Code Online (Sandbox Code Playgroud)
我知道python将0计算为False,那么当n为0时,如果保持代码的当前长度/结构,我将如何让python返回零而不是False?这甚至可能吗?
此外,这种创建函数(递归或其他)的风格是否比教科书版本更好或更不可取/ pythonic?(我想象的不仅仅是因为可读性)
为了清楚起见,我已经满足了作业的要求,而且仅仅为了个人知识,我想更清楚地了解回报声明中发生的事情.
Nik*_* B. 10
x and y or z
如果y
是假的话,成语不起作用.您可以交换条件以使其工作:
def fibonacci(n):
return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n
Run Code Online (Sandbox Code Playgroud)
但是,从Python 2.5(6年前发布)开始,我们有适当的条件表达式,不再需要and/or
hack:
def fibonacci(n):
return n if n < 2 else fibonacci(n-1) + fibonacci(n-2)
Run Code Online (Sandbox Code Playgroud)
现在这具有指数运行时复杂性.如果您想要高效,请使用该O(n)
算法:
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
Run Code Online (Sandbox Code Playgroud)
或者甚至编写一个生成器来生成所有数字,并且只需要尽可能多的数量.