4

对于一个任务,我们被要求定义一个斐波那契函数,我用这个来完成:

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

但是,我已经看到递归函数,例如阶乘函数,在一行 return 语句中定义,如下所示:

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,同时保持代码的当前长度/结构?这甚至可能吗?

此外,这种创建函数(递归或其他)的风格是否比教科书版本更可取/更不受欢迎?(我想不仅仅是因为可读性)

需要明确的是,我已经满足了作业的要求,并且仅出于个人知识,我希望更清楚地了解 return 语句中发生的事情。

4

2 回答 2

10

如果是falsy,这个x and y or z成语就不起作用。您可以交换条件以使其仍然有效:y

def fibonacci(n):
    return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n

然而,从 Python 2.5(6 年前发布)开始,我们有了适当的条件表达式,不再需要and/orhack:

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

或者甚至编写一个生成器来产生所有数字,并且只取你需要的数量。

于 2012-05-09T19:36:49.197 回答
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
于 2012-05-09T19:38:19.860 回答