[英]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.