Python条件运算符'if else'不等于'和'

时间:2015-11-18 12:52:06

标签: python python-2.7 conditional-operator

我认为下面的两个函数结果是相同的,但它不是。

def fib2(n):
  return n and n < 2 or fib2(n-1) + fib2(n-2)

def fib3(m):
  return m if m < 2 else fib3(m-1) + fib3(m-2)

当参数值为4时,fib2的输出为7,fib3的输出为3.为什么会出现这种情况? 我不知道这个。
我的Python版本是2.7.9,os是osX 10.11.1

1 个答案:

答案 0 :(得分:1)

我试着变得更加冗长,并且像这样编写你的函数:

def fib2(n):
    ret = n and n < 2 or fib2(n-1) + fib2(n-2)
    print "fib2({}) = {}".format(n, ret)
    return ret

print fib2(4)

def fib3(m):
    ret = m if m < 2 else fib3(m-1) + fib3(m-2)
    print "fib3({}) = {}".format(m, ret)
    return ret

print fib3(4)

fib2似乎试图为数字添加布尔值,这就是为什么它不正确。 fib3只处理数字并且是正确的。但请注意,这不是推荐的计算斐波纳契数的方法!如果您尝试使用fib3(1000),它将无限运行。从0和1开始更好,而不是使用递归来计算斐波纳契数。

我写了一个简短的函数,为你计算Fibonacci数#n:

def fib4(n):
    a = 0
    b = 1
    for i in range(1, n + 1):
        a, b = (b, a + b)
    return a

print fib4(0)
print fib4(1)
print fib4(2)
print fib4(3)
print fib4(4)
print fib4(1000)

请注意,它也适用于n==1000