繁体   English   中英

使用列表推导式的斐波那契数列

[英]Fibonacci sequence using list comprehension

我想写一个列表推导式,它会给出Fibonacci数,直到数字 4 百万。 我想将其添加到列表理解和求和均匀间隔的术语中。

from math import sqrt
Phi = (1 + sqrt(5)) / 2
phi = (1 - sqrt(5)) / 2
series = [int((Phi**n - phi**n) / sqrt(5)) for n in range(1, 10)]
print(series)
[1, 1, 2, 3, 5, 8, 13, 21, 34]

这是一个有效的示例代码,我想使用列表理解编写类似的代码。 请帮忙。

a, b = 1, 1
total = 0
while a <= 4000000:
    if a % 2 == 0:
        total += a
    a, b = b, a+b 
print(total)

由于您需要做的事情不需要实际列表,因此理解列表有点浪费。 更好的是只提供一个功能来为您完成所有繁重的工作,例如:

def sumEvenFibsBelowOrEqualTo(n):
    a, b = 1, 1
    total = 0
    while a <= n:
        if a % 2 == 0:
            total += a
        a, b = b, a + b 
    return total

然后用print(sumEvenFibsBelowOrEqualTo(4000000))调用它。

如果你真的想斐波那契数(也许你想在其上运行不同的内涵)的列表,你可以做一个小的修改要做到这一点-这将返回一个列表,而不是偶值的总和:

def listOfFibsBelowOrEqualTo(n):
    a, b = 1, 1
    mylist = []
    while a <= n:
        mylist.append(a)
        a, b = b, a + b
    return mylist

然后,您可以使用以下列表理解来对偶数求和:

print(sum([x for x in listOfFibsBelowOrEqualTo(4000000) if x % 2 == 0]))

考虑到 Fibonacci 数很快变得非常大(所以列表不会那么大),这可能还不算太糟糕,但是,对于其他不这样做的序列(或更大的限制),构造一个列表可能不必要地使用大块内存。


一个更好的方法可能是使用一个生成器,如果你想要一个列表,你总是可以从中构造一个。 但是,如果你并不需要一个列表中,您仍然可以使用它在列表解析:

def fibGen(limit):
    a, b = 1, 1
    while a <= limit:
        yield a
        a, b = b, a + b

mylist = list(fibGen(4000000))                          # a list
print(sum([x for x in fibGen(4000000) if x % 2 == 0]))  # sum evens, no list

列表推导本质上是一个并行过程; 这是一个输入可迭代对象的过程,将某个函数应用于每个元素,并创建一个输出列表。 应用此功能时,它会独立于其他元素应用于每个元素。 因此,列表推导式不适合迭代算法,例如您提出的算法。 它可以用在你的封闭式公式中:

sum([int((Phi**n - phi**n) / sqrt(5)) for n in range(1, 10) if int((Phi**n - phi**n) / sqrt(5))%2 == 0])

如果要使用迭代算法,生成器更合适。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM