计算斐波那契数列中偶数的和

0 投票
2 回答
579 浏览
提问于 2025-04-17 21:14

我遇到了一个解决这个问题的方法,但有几行我不太明白。首先,n<=1 and 1fib(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 ...

正如你所看到的,斐波那契函数是一个部分函数:

Image from WikiPedia

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,这实际上是在检查一个数字是否是奇数,而这里我们需要的是一个不是奇数的数字,也就是偶数。

撰写回答