计算斐波那契数列中偶数的和
我遇到了一个解决这个问题的方法,但有几行我不太明白。首先,n<=1 and 1
在fib(n)
的定义中是什么意思?还有更重要的是,为什么它不在if not fib(i)%2
里面?这难道不是意味着“如果给定的斐波那契数不是偶数,那么我们就把它加到总数里”吗?
cache = {}
def fib(n):
cache[n] = cache.get(n, 0) or (n<=1 and 1
or fib(n-1)+fib(n-2))
return cache[n]
i = 0
n = 0
# we have to pretend the series doesn't go beyond 4 mil
while fib(i) <= (4000000):
if not fib(i) % 2:
n = n + fib(i)
i = i + 1
print n
2 个回答
1
斐波那契数列是从1开始的。在这段代码中,它会检查给定的值是否小于或等于1。
1 1
2 3 5 8 13 ...
正如你所看到的,斐波那契函数是一个部分函数:

1
让我们简单分析一下:
(n <= 1) and 1 or (fib(n - 1) + fib(n - 2))
这是Python程序员用来模拟C语言中通常有的条件三元运算符的方法,而Python本身没有这个功能。简单来说,这个条件判断是说如果n小于等于1,就返回1,否则就执行fib(n - 1) + fib(n - 2)
。
第二个问题:
这个问题涉及到Python(以及其他一些语言)是如何把数字转换成布尔值的。对于整数来说,0
被认为是False,而其他所有整数都被认为是True。在这种情况下,把一个偶数用2去除余数会得到0,而奇数则会得到1,这实际上是在检查一个数字是否是奇数,而这里我们需要的是一个不是奇数的数字,也就是偶数。