Python 试图写一个代码来找出斐波那契序列的偶数之和?
我是编程新手,我正试图用Python编写一个程序,在斐波那契数列中找到低于4000000的偶数之和。我不确定我做错了什么,但什么都不会打印出来。谢谢你的帮助Python 试图写一个代码来找出斐波那契序列的偶数之和?,python,Python,我是编程新手,我正试图用Python编写一个程序,在斐波那契数列中找到低于4000000的偶数之和。我不确定我做错了什么,但什么都不会打印出来。谢谢你的帮助 def fib(): listx = [] for x in range(4000000): if x == 0: return 1 elif x == 1: return 1 else:
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)
也许这对你有帮助
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
def sumOfEvenFibs():
#斐波那契序列中的a,b,c
a=1
b=1
结果=0
而b<4000000:
如果b%2==0:
结果+=b
c=a+b
a=b
b=c
返回结果
首先,您的需求和您交付的代码之间似乎存在一些争议:-)您的问题文本(可能来自作业或Euler#2)要求
斐波那契数列中低于4000000的偶数之和
您的代码是对前400万个斐波那契数的偶数求和,这两个数相差很大。根据比内特的公式,第四百万个斐波那契数以北有800000个数字(而最高的数字在四百万以下有七个数字)
因此,假设文本比代码更正确,实际上不需要构建一个列表,然后对其中的每个项目进行求值,这相当浪费内存
斐波那契数可以动态生成,如果它们是偶数,就可以简单地累加。能够使用任意方法来累积数字也更有用,如下所示:
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)
def sumFibWithCond(限制,回调):
#设置初始条件。
祖父母、父母、子女=0,0,1
累计=0
#循环,直到数量达到或超过限制。
当儿童<限制:
#向蓄能器添加任何合适的数字。
累计=累计+回调(子项)
#设置下一个斐波那契循环。
祖父母,父母=父母,孩子
孩子=祖父母+孩子
#完成后返回蓄能器。
返回累计
def蓄能阀(数量):
#按原样返回偶数,奇数返回零。
如果num%2==0:
返回数
返回0
sumEvensBelowFourMillion=sumFibWithCond(4000000,累计)
特别值得注意的是初始条件。这些数字被初始化为0,0,1
,因为我们希望确保检查每个斐波那契数(在子项中)的累积条件。这意味着child
的初始值应该是一,根据问题,假设这是您想要的第一个数字
这在当前场景中没有任何区别,因为一个不是偶数,但是,如果您将累加条件更改为“奇数”(或允许奇数的任何其他条件),它将产生区别
而且,如果您希望订阅从零开始的斐波那契序列,则起始值应为0,1,0
。以下是一种使用生成器将内存使用保持在最低限度的方法:
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\u gen(最多):
n、 m=0,1
当你不调用你的函数时。除非您在代码中调用它们,否则什么都不会运行。range(4000000)
?你会有一个(大的)惊喜…而且,如果x==1
和如果x==0
对于范围
只能为真一次。其他迭代将进入我认为是递归的尝试。相反,使用模数%
检查奇数/偶数。@Evert,范围(4000000)
对于Python3是合适的(事实上它是print(y)
而不是print y
似乎表明这是正在使用的版本),这给了您一个惰性迭代器,而不是一个具体的集合。真正的问题是用它来构造一个列表,而不仅仅是处理值。@paxdiablo我的评论是关于计算3999999斐波那契数(或低于此数的许多数)的想法。更好的是,你不需要将每个数除以2;你可以简单地每三个数字返回一次:1,1,2,3,5,8,13,21,34,@chepner,这对于非常具体的情况来说是很好的,但是现在的代码适应性更强,这意味着像每三个数字这样的技巧是不可靠的。为了澄清,OEIS说0
是Fibonacci数的第一个,这是奇数相加。
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