我是编程的新手,我正在尝试用Python编写一个程序,它将在Fibonacci序列中找到低于4,000,000的偶数的总和。我不确定我做错了什么但没有打印出来。谢谢你的帮助。
def fib():
listx = []
for x in range(4000000):
if x == 0:
return 1
elif x == 1:
return 1
else:
listx.append(fib(x - 1) + fib(x - 2))
return listx
def evens(fib):
y = 0
for x in fib():
if x % 2 == 0:
y += x
else:
continue
print (y)
答案 0 :(得分:1)
这是一种使用生成器将内存使用量降至最低的方法:
def fib_gen(up_to):
n, m = 0, 1
while n <= up_to:
yield n
n, m = m, n + m
total = 0
for f in fib_gen(4000000):
if f % 2 == 0:
total += f
另一种选择:
def fib_gen(up_to, filter):
n, m = 0, 1
while n <= up_to:
if filter(n):
yield n
n, m = m, n + m
sum(fib_gen(4000000, lambda f: f % 2 == 0)) # sum of evens
sum(fib_gen(4000000, lambda f: f % 2)) # sum of odds
答案 1 :(得分:0)
首先,您的要求与您提供的代码之间似乎存在争议:-)您的问题文本(可能来自作业或Euler#2)要求......
Fibonacci序列中低于4,000,000的偶数的总和。
您的代码汇总了前四百万斐波那契数字中的偶数,这些数字非常不同。根据比奈的公式,第四百万个斐波那契数字在其中北部有800,000个数字(而不是最高的一个数字中的七个数字低于四百万个)。
因此,假设文本比代码更正确,您实际上并不需要构建列表然后评估其中的每个项目,这在内存上相当浪费。
Fibonacci数字可以在运行中生成,然后只要它们是偶数就可以累积。能够使用任意方法累积数字也更有用,如下所示:
def sumFibWithCond(limit, callback):
# Set up initial conditions.
grandparent, parent, child = 0, 0, 1
accum = 0
# Loop until number is at or beyond limit.
while child < limit:
# Add any suitable number to the accumulator.
accum = accum + callback(child)
# Set up next Fibonacci cycle.
grandparent, parent = parent, child
child = grandparent + child
# Return accumulator when done.
return accum
def accumulateEvens(num):
# Return even numbers as-is, zero for odd numbers.
if num % 2 == 0:
return num
return 0
sumEvensBelowFourMillion = sumFibWithCond(4000000, accumulateEvens)
特别值得注意的是初始条件。这些数字初始化为0, 0, 1
,因为我们要确保检查每个 Fibonacci数(在child
中)的累积条件。这意味着child
的初始值应该是一个假设,根据问题,这是您想要的第一个数字。
这在当前场景中没有任何区别,因为一个不是偶数,但是,你是否要将累积条件改为&#34;奇数&#34; (或允许一个的任何其他条件),它会产生影响。
而且,如果您更愿意订阅以零开头的斐波纳契序列,则起始值应为0, 1, 0
。
答案 2 :(得分:-1)
也许这会对你有帮助。
def sumOfEvenFibs():
# a,b,c in the Fibonacci sequence
a = 1
b = 1
result = 0
while b < 4000000:
if b % 2 == 0:
result += b
c = a + b
a = b
b = c
return result