小于400万的偶数斐波那契数之和-Python

小于400万的偶数斐波那契数之和-Python,python,math,if-statement,fibonacci,Python,Math,If Statement,Fibonacci,我正在尝试python中的第二个Project Euler问题,并想了解我的代码为什么不能工作 此代码查找小于400万的偶数斐波那契数之和 counter = 2 total = 0 while counter <= 4000000: if counter % 2 == 0: total+= counter counter+= (counter -1) print total 计数器=2 总数=0 当计数器时,算法应该是固定的。在您的代码中,您不是

我正在尝试python中的第二个Project Euler问题,并想了解我的代码为什么不能工作

此代码查找小于400万的偶数斐波那契数之和

counter = 2
total = 0
while counter <= 4000000:
    if counter % 2 == 0:
        total+= counter    
    counter+= (counter -1)
print total
计数器=2
总数=0

当计数器时,算法应该是固定的。在您的代码中,您不是对斐波那契数求和

以下是修订版:

total = 0

i, j = 1, 0

while j <= 4000000:
        if j % 2 == 0:
                total += j
        i, j = j, i + j

print total
total=0
i、 j=1,0

当j首先,您应该使用递归公式生成所有低于4000000的斐波那契数,对于每个数,如果是偶数,则将其添加到总和中

公式:

井算法是错误的。 柜台总是很奇怪,只是刚开始时是偶数。事情就是这样 2. 3. 5. 9 17
等等
total+=计数器
从不执行

问题出在
计数器+=(计数器-1)
行中。在执行此操作时,将其添加到自身(减1):

a, b = 1, 1
total = 0
while a <= 4000000:
    if a % 2 == 0:
        total += a
    a, b = b, a+b  # the real formula for Fibonacci sequence
print total
a,b=1,1
总数=0

而您的代码为
计数器计算的序列如下所示:

2 # solid start
3 # good
5 # this is going great
9 # wait, what?
17 # this is going really badly
您不能每次只添加
计数器-1
,您需要添加序列中的前一个数字

那么为什么你的
总数这么小?因为奇数减一总是偶数,奇数加偶数总是奇数
2
是您生成的唯一偶数,因此这是您的
总数

生成斐波那契数通常使用两个变量
a
b
,从这里开始

a = b = 1
每个迭代看起来像:

a, b = b, a + b

有更简单的方法可以做到这一点(例如,freakish的解决方案),但是这个版本说明了它做什么,做什么:-)

从itertools导入takewhile
def fibonacci():
a、 b=1,1
而1:
产生
a、 b=b,a+b
def偶数(it):
对于其中的n:
如果n%2==0:
产量

打印总和(takewhile(λf:f如果仔细观察,您将看到以下顺序:

1 1 2 3 5 8 13 21 34 55 89 144

映射斐波那契序列的公式为:

您只需要偶数的总和,例如:

123 5813 213455 89144

因此,您可以映射一个新公式,例如:

您将获得以下序列:

2834144

代码示例(Go):

主程序包
输入“fmt”
func fibonacci()func()int{
第一,第二:=0,2
返回func()int{
ret:=第一
第一,第二=第二,第一+(4*秒)
回程网
}
}
func main(){
总和:=0
f:=fibonacci()
对于i:=0;总和<4000000;i++{
总和+=f()
}
格式打印项次(总和)
}
在这种情况下,您将不需要if条件

希望这对你有帮助!干杯!

#包括
#include <iostream>

using namespace std;

int main()
{

    int total, a=1,b=2,c;

    while(a+b<4000000)
    {
       if(b%2==0)
       {
          total+=b;
       }
       c=a+b;
       a=b;
       b=c;
    }

    cout<<total;

    return 0;
}
使用名称空间std; int main() { 整数总计,a=1,b=2,c;
(a+b这是我的Python代码。我利用了两件事。首先,第n个斐波那契数可以计算为:
Fibn=[φn-(1-φn)]/√5,
事实上,偶数出现在每3个斐波那契数上。这避免了很多不必要的计算

import numpy as np
import time

start = time.perf_counter()
phi_p = (np.sqrt(5)+1)/2
phi_n = phi_p-1
sqrt5_inv = 1/np.sqrt(5)

def Fib(n):
     return int(sqrt5_inv*((phi_p)**n-(-phi_n)**n))

fib_e_sum = 0
index = 3
max_fib = 4e6
tmp_fib = 0
while (tmp_fib<max_fib):
    fib_e_sum += tmp_fib
    tmp_fib=Fib(index)
    index += 3

end = time.perf_counter()
total_time = end-start
print(fib_e_sum)
print(total_time)
将numpy导入为np
导入时间
开始=时间。性能计数器()
phi_p=(np.sqrt(5)+1)/2
φn=φp-1
sqrt5_inv=1/np.sqrt(5)
def纤维(n):
返回整数(sqrt5_inv*((phi_p)**n-(-phi_n)**n))
fib_e_sum=0
指数=3
最大纤维长度=4e6
tmp_fib=0

虽然(tmp_fib我试过这样做:

fib_num = [0 ,1]
for i in range(2, 4*10**6):
    fib_num.append(fib_num[i-1] + fib_num[i-2])

def even_fib(fib_num):
    result = 0
    result = result + sum([even for even in range(0, fib_num) if even % 2 == 0])
print result

这有什么问题吗?脚本的响应时间太长,出现“killed”错误

以下是我解决此问题的方法:

l = []
k = []
(x, y) = (1, 2)
while x < 4000000:
    k.append(x)
    k.append(y)
    x += y
    y += x
for i in k:
    if i % 2 == 0:
        l.append(i)
print(sum(l))
l=[]
k=[]
(x,y)=(1,2)
当x<4000000时:
k、 附加(x)
k、 附加(y)
x+=y
y+=x
对于k中的i:
如果i%2==0:
l、 附加(i)
打印(总和(l))

输出:4613732

这是我使用异或门的Python解决方案。我初始化了前两个值,然后在每次迭代中,我存储前两个数字的状态。理论上,只有当两个数字都是奇数或偶数时,两个数字的和才是偶数

a = 1
b = 2

a_state = 1 #odd = 1 
b_state = 0 #even = 0

sum = b
output = []
while (a+b) < 1000:
    c = a+b
    a = b
    b = c
    
    if (a_state ^ b_state) == 0:
        sum += c
        a_state = b_state
        b_state = 0
    else:
        a_state = b_state
        b_state = 1
print(sum)
a=1
b=2
a#U状态=1#奇数=1
b_状态=0#偶数=0
总和=b
输出=[]
当(a+b)<1000时:
c=a+b
a=b
b=c
如果(a_状态^b_状态)==0:
总和+=c
a_状态=b_状态
b_状态=0
其他:
a_状态=b_状态
b_状态=1
打印(总和)

该如何修复?简短的回答是您的断言“此代码发现偶数斐波那契数之和小于400万”是假的。你的代码甚至没有尝试这样做。你知道什么是斐波那契数,以及如何计算级数吗?在循环中打印
counter
,你会看到你没有得到斐波那契数。你得到的级数是3,5,9,17,33,65,…它们都是奇数,这意味着
2
是唯一加在t上的数o总数。如果使用调试软件(例如,尝试PyCharm),您可以在编译过程中停止这样的函数并检查中间值。这样您就可以很容易地看出错误所在。您的意思是他应该使用递归公式,而不是使用递归解决方案/函数,对吗…?是的,我这样做了。很抱歉造成混淆。您应该只使用3个变量:a1=1,a2=1,a3;在每一步中,a3=a1+a2、a1=a2和a2=a3。a3是您正在学习的当前数字。@Scooby您不需要三个变量;请参阅我的答案,了解如何使用元组解包跳过中间变量
a3
您是对的。第三个变量是无用的,但不更容易理解吗?total的每一个输出都是数字2。@nons请选择“是”,因为这是序列生成的唯一偶数。这在这里无关紧要,但不应
fibonacci
生成一个
?否则在开始时只能得到一个
1
。此外,
如果不是n%2:l = []
k = []
(x, y) = (1, 2)
while x < 4000000:
    k.append(x)
    k.append(y)
    x += y
    y += x
for i in k:
    if i % 2 == 0:
        l.append(i)
print(sum(l))
a = 1
b = 2

a_state = 1 #odd = 1 
b_state = 0 #even = 0

sum = b
output = []
while (a+b) < 1000:
    c = a+b
    a = b
    b = c
    
    if (a_state ^ b_state) == 0:
        sum += c
        a_state = b_state
        b_state = 0
    else:
        a_state = b_state
        b_state = 1
print(sum)