我为 Project Euler 的问题 2 编写了部分解决方案,但我很难理解如何对生成的数字求和
I wrote a partial soluton to Problem 2 of Project Euler, but I'm having a difficult time understanding how to sum the generated numbers
欧拉计划第2题,你需要将斐波那契数列中的所有偶数相加,直到4,000,000。我编写的代码仅生成斐波那契数列的偶数,最多为 4,000,000,但我似乎无法弄清楚如何对它们求和。
我已经尝试过将数字附加到列表然后对它们求和,这会引发错误。我已经尝试实现诸如 sum =+ fibonacci(i)
之类的代码,它也会引发相同的错误。注意:我是 Python 的新手,而且我还在学习,如果这看起来很菜鸟,我深表歉意。我搜索了 Whosebug 并发现了一些类似的问题,但答案是与我正在尝试的完全相反的代码 and/or 有些答案有缺陷,这就是我发布问题的原因。
在 if fibonacci(i) % 2 == 0:
之后,我不知道该做什么,我已经为此工作了将近一个小时。
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
answer = 0
for i in range(0, 10):
x = fibonacci(i)
if x % 2 == 0:
answer =+ x
print(answer)
我似乎无法理解如何在不出现错误的情况下对这些数字求和:"int is not an iterable object."
代码应该打印出斐波那契数列中所有偶数的总和,直到 4,000,000,然后打印出结果。
注意:我知道使用 sum 作为变量是阴影...我使用它只是因为另一个 Whosebug 解决方案推荐了它(它被大力支持),所以请不要关注这个作为问题是因为这不是问题。即使我将 sum
换成另一个随机变量,例如 x
,也会抛出相同的错误。
为什么不在生成偶数时求和而不是创建一个中间列表:
def sumEvenFibo(N):
total = 0
a,b = 2,3
for _ in range(N//3):
total += a # print(a) if you want to see which numbers are added
a,b = a+2*b,2*a+3*b
return total
获得第 4,000,000 个斐波那契数的偶数总和大约需要 5 分钟(2.9 GHz Intel Core i9 笔记本电脑)。如果只想要1到4,000,000之间的偶数斐波那契数之和,这应该足够快了(0.11毫秒)
编辑优化版本:
此优化版本在 8 秒内生成前 4,000,000 个偶数斐波那契数的总和。
或者 2.6 秒,如果您只是从前 4M 个斐波那契数中寻找偶数的总和
如果您要查找 1 到 4,000,000 范围内的偶数斐波那契数之和,则为 0.024 毫秒。 (只有 34 个斐诺巴契数,其中只有 11 个是偶数)
# Function to return the Nth, Nth+1 Fibonacci number in log(N) time
def binFibo(N):
a,b = 1,1
f0,f1 = 0,1
r,s = (1,1) if N&1 else (0,1)
N //=2
while N > 0:
a,b = f0*a+f1*b, f0*b+f1*(a+b)
f0,f1 = b-a,a
if N&1: r,s = f0*r+f1*s, f0*s+f1*(r+s)
N //= 2
return r,s
# Function to return the Nth, Nth+1 Even Fibonacci number in log(N) time
def binEvenFibo(N):
a,b = binFibo(3*N)
return a,a+2*b
# function to return the sum of the first N even Fibonacci numbers
# Log(N)^2 time
#
def binSumEvenFibo(N,rec=False):
if N < 2: return [(0,2),(2,8)][N] if rec else [0,2][N]
m = N//2
f0,f1 = binEvenFibo(m-1)
p0,p1 = f0//2,f1//2
a,b = binSumEvenFibo(m,True)
r = a + p0*a+p1*b
s = b + p0*b+p1*(a+4*b)
if N&1:
d0,d1 = binEvenFibo(N)
r,s = r+d0, s+d1
return (r,s) if rec else r
使用示例:
binSumEvenFibo(100) # sum of the first 100 even fibonacci numbers
# 290905784918002003245752779317049533129517076702883498623284700
错误 "int is not an iterable object" 是由于 sum
函数在需要可迭代对象(例如列表)时将数字传递给该函数引起的。
按照您的代码,您可以继续将所有斐波那契数添加到一个变量中:
result = 0
for i in range(0, 10):
f_i = fibonacci(i)
if f_i % 2 == 0:
result += f_i
print(result)
或将其附加到列表并使用 sum
函数:
even_numbers = []
for i in range(0, 10):
f_i = fibonacci(i)
if f_i % 2 == 0:
even_numbers.append(f_i)
print(sum(even_numbers))
欧拉计划第2题,你需要将斐波那契数列中的所有偶数相加,直到4,000,000。我编写的代码仅生成斐波那契数列的偶数,最多为 4,000,000,但我似乎无法弄清楚如何对它们求和。
我已经尝试过将数字附加到列表然后对它们求和,这会引发错误。我已经尝试实现诸如 sum =+ fibonacci(i)
之类的代码,它也会引发相同的错误。注意:我是 Python 的新手,而且我还在学习,如果这看起来很菜鸟,我深表歉意。我搜索了 Whosebug 并发现了一些类似的问题,但答案是与我正在尝试的完全相反的代码 and/or 有些答案有缺陷,这就是我发布问题的原因。
在 if fibonacci(i) % 2 == 0:
之后,我不知道该做什么,我已经为此工作了将近一个小时。
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
answer = 0
for i in range(0, 10):
x = fibonacci(i)
if x % 2 == 0:
answer =+ x
print(answer)
我似乎无法理解如何在不出现错误的情况下对这些数字求和:"int is not an iterable object."
代码应该打印出斐波那契数列中所有偶数的总和,直到 4,000,000,然后打印出结果。
注意:我知道使用 sum 作为变量是阴影...我使用它只是因为另一个 Whosebug 解决方案推荐了它(它被大力支持),所以请不要关注这个作为问题是因为这不是问题。即使我将 sum
换成另一个随机变量,例如 x
,也会抛出相同的错误。
为什么不在生成偶数时求和而不是创建一个中间列表:
def sumEvenFibo(N):
total = 0
a,b = 2,3
for _ in range(N//3):
total += a # print(a) if you want to see which numbers are added
a,b = a+2*b,2*a+3*b
return total
获得第 4,000,000 个斐波那契数的偶数总和大约需要 5 分钟(2.9 GHz Intel Core i9 笔记本电脑)。如果只想要1到4,000,000之间的偶数斐波那契数之和,这应该足够快了(0.11毫秒)
编辑优化版本:
此优化版本在 8 秒内生成前 4,000,000 个偶数斐波那契数的总和。
或者 2.6 秒,如果您只是从前 4M 个斐波那契数中寻找偶数的总和
如果您要查找 1 到 4,000,000 范围内的偶数斐波那契数之和,则为 0.024 毫秒。 (只有 34 个斐诺巴契数,其中只有 11 个是偶数)
# Function to return the Nth, Nth+1 Fibonacci number in log(N) time
def binFibo(N):
a,b = 1,1
f0,f1 = 0,1
r,s = (1,1) if N&1 else (0,1)
N //=2
while N > 0:
a,b = f0*a+f1*b, f0*b+f1*(a+b)
f0,f1 = b-a,a
if N&1: r,s = f0*r+f1*s, f0*s+f1*(r+s)
N //= 2
return r,s
# Function to return the Nth, Nth+1 Even Fibonacci number in log(N) time
def binEvenFibo(N):
a,b = binFibo(3*N)
return a,a+2*b
# function to return the sum of the first N even Fibonacci numbers
# Log(N)^2 time
#
def binSumEvenFibo(N,rec=False):
if N < 2: return [(0,2),(2,8)][N] if rec else [0,2][N]
m = N//2
f0,f1 = binEvenFibo(m-1)
p0,p1 = f0//2,f1//2
a,b = binSumEvenFibo(m,True)
r = a + p0*a+p1*b
s = b + p0*b+p1*(a+4*b)
if N&1:
d0,d1 = binEvenFibo(N)
r,s = r+d0, s+d1
return (r,s) if rec else r
使用示例:
binSumEvenFibo(100) # sum of the first 100 even fibonacci numbers
# 290905784918002003245752779317049533129517076702883498623284700
错误 "int is not an iterable object" 是由于 sum
函数在需要可迭代对象(例如列表)时将数字传递给该函数引起的。
按照您的代码,您可以继续将所有斐波那契数添加到一个变量中:
result = 0
for i in range(0, 10):
f_i = fibonacci(i)
if f_i % 2 == 0:
result += f_i
print(result)
或将其附加到列表并使用 sum
函数:
even_numbers = []
for i in range(0, 10):
f_i = fibonacci(i)
if f_i % 2 == 0:
even_numbers.append(f_i)
print(sum(even_numbers))