偶数斐波那契数之和 < X
Sum of Even Fibonacci Numbers < X
我正在研究这个,我似乎有一个可行的解决方案,但我很难理解它的行为。
这是我的。
#!/usr/bin/python
def even_fib_sums(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
if not number % 2:
total += number
yield total
print sum(even_fib_sums(4000000))
我是编程新手,但考虑到我需要循环遍历该范围内的所有 4000000 个数字,这对我来说不是很有效。
如果我使用相同的方法生成最多 5 的斐波那契数列如下所示,您将看到下面的结果。
def generate_fib(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
print number
generate_fib(5)
结果:1,2,3,5,8
在结果中的这些数字中,只有 2 和 8 % 2 == 0。
总和应该是 10,但如果我要使用上面的第一个代码片段,我将返回 12。为什么这样?
通过使用 for counter in range(0, limit)
,您的函数中有 'limit' 迭代。例如,如果您的 'limit' 变量是 10,您将不会得到小于 10 的偶数斐波那契数之和,但您将得到前 10 个偶数斐波那契数之和。
为了使您的代码正常工作,您需要将 for counter in range(0, limit)
替换为 while last < limit
,并且每次发现最后一个是偶数时,将其添加到总数中。
在第一个代码片段中,您计算了整数的总和,而不是仅仅得出数字。如果你希望在你的第一个代码片段中输入 5 得到 10,你应该通过以下方式之一修改代码(这里不是试图提高效率,只是为了解决问题):
...
number = before_last + last
if not number % 2:
yield number
print sum(even_fib_sums(4000000))
或
...
number = before_last + last
if not number % 2:
total += number
return total
print even_fib_sums(4000000)
您或许可以稍微清理一下生成函数。我会这样写。
def fib(x):
a = 1
b = 1
yield a
yield b
a,b = b,a+b
while b<=x:
yield b
a,b = b,a+b
这将为您提供一个生成函数,它将为您提供所有小于或等于 x 的斐波那契数(我们在这里应该更加小心,因为无论如何我们都会 return 前两个数字).
那我们就可以
sum(x for x in fib(4000000) if x%2==0)
您应该更改您的代码以仅生成数字,而不是总和,或者仅将生成更改为 return,然后像这样删除 sum() keyworkd:
def even_fib_sums(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
if not number % 2:
total += number
return total
打印even_fib_sums(5)
考虑斐波那契数列中不超过四百万的项,求even-valued项之和
你只需要循环直到你遇到一个大于 400000 的 fib,而不是你的代码试图做的第 4 百万分之一斐波那契数,你可以简化为使用带有求和的生成器函数,只产生偶数和中断当你击中斐波那契数 > 4000000 时的循环:
def fib(n):
a, b = 0, 1
while a <= n:
a, b = b, a + b
if not b & 1:
yield b
print(sum(fib(4000000)))
计算需要几分之一秒:
In [5]: timeit sum(fib(4000000))
100000 loops, best of 3: 6 µs per loop
尝试 timeit even_fib_sums(4000000)
几分钟后仍然 运行。
我正在研究这个,我似乎有一个可行的解决方案,但我很难理解它的行为。
这是我的。
#!/usr/bin/python
def even_fib_sums(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
if not number % 2:
total += number
yield total
print sum(even_fib_sums(4000000))
我是编程新手,但考虑到我需要循环遍历该范围内的所有 4000000 个数字,这对我来说不是很有效。
如果我使用相同的方法生成最多 5 的斐波那契数列如下所示,您将看到下面的结果。
def generate_fib(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
print number
generate_fib(5)
结果:1,2,3,5,8
在结果中的这些数字中,只有 2 和 8 % 2 == 0。 总和应该是 10,但如果我要使用上面的第一个代码片段,我将返回 12。为什么这样?
通过使用 for counter in range(0, limit)
,您的函数中有 'limit' 迭代。例如,如果您的 'limit' 变量是 10,您将不会得到小于 10 的偶数斐波那契数之和,但您将得到前 10 个偶数斐波那契数之和。
为了使您的代码正常工作,您需要将 for counter in range(0, limit)
替换为 while last < limit
,并且每次发现最后一个是偶数时,将其添加到总数中。
在第一个代码片段中,您计算了整数的总和,而不是仅仅得出数字。如果你希望在你的第一个代码片段中输入 5 得到 10,你应该通过以下方式之一修改代码(这里不是试图提高效率,只是为了解决问题):
...
number = before_last + last
if not number % 2:
yield number
print sum(even_fib_sums(4000000))
或
...
number = before_last + last
if not number % 2:
total += number
return total
print even_fib_sums(4000000)
您或许可以稍微清理一下生成函数。我会这样写。
def fib(x):
a = 1
b = 1
yield a
yield b
a,b = b,a+b
while b<=x:
yield b
a,b = b,a+b
这将为您提供一个生成函数,它将为您提供所有小于或等于 x 的斐波那契数(我们在这里应该更加小心,因为无论如何我们都会 return 前两个数字).
那我们就可以
sum(x for x in fib(4000000) if x%2==0)
您应该更改您的代码以仅生成数字,而不是总和,或者仅将生成更改为 return,然后像这样删除 sum() keyworkd:
def even_fib_sums(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
if not number % 2:
total += number
return total
打印even_fib_sums(5)
考虑斐波那契数列中不超过四百万的项,求even-valued项之和
你只需要循环直到你遇到一个大于 400000 的 fib,而不是你的代码试图做的第 4 百万分之一斐波那契数,你可以简化为使用带有求和的生成器函数,只产生偶数和中断当你击中斐波那契数 > 4000000 时的循环:
def fib(n):
a, b = 0, 1
while a <= n:
a, b = b, a + b
if not b & 1:
yield b
print(sum(fib(4000000)))
计算需要几分之一秒:
In [5]: timeit sum(fib(4000000))
100000 loops, best of 3: 6 µs per loop
尝试 timeit even_fib_sums(4000000)
几分钟后仍然 运行。