2010-01-15 3 views
0

Может кто-нибудь сказать мне, почему это должно быть неправильно?Проект Эйлера № 2 с Python

#Each new term in the Fibonacci sequence is generated 
#by adding the previous two terms. By starting with 1 and 2, 
#the first 10 terms will be: 
#1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 
#Find the sum of all the even-valued terms in the sequence 
#which do not exceed four million. 


sum=2 

list = [1,2] 
for x in range(2,100): 
    a = list[x-2]+list[x-1] 
    print(a) 
    list.append(a) 
    if a % 2 == 0: 
     sum += a 
     print('sum', sum) 
     if sum >= 4000000: 
      break 
+0

В чем проблема при попытке запустить его? Вы получаете неправильный результат? Вы получили сообщение об ошибке? – Wesley

+0

Я неправильно читаю эту проблему (но по-другому): http://stackoverflow.com/questions/736495/haskell-script-running-out-of-space –

+0

Кстати, первые два числа Фибоначчи - это 1 ... но это, конечно, не влияет на сумму четных членов. :) –

ответ

6

заменить

sum += a 
    print('sum', sum) 
    if sum >= 4000000: 
     break 

с

if a > 4000000: 
     break 
    sum += a 
    print('sum', sum) 

Вы должны сравнить "а" с 4000000, а не "сумма", как сказал Даниэль Роземан.

2

Заданный вопрос о сумме даже условий, которые не превышают четырех миллионов. Вы проверяете, если сумма не превышает 4 м.

7

Вот совершенно другой способ решить эту проблему с помощью генератора и itertools:

def fib(): 
    a = b = 1 
    while 1: 
     yield a 
     a, b = b, a + b 

import itertools 
print sum(n for n in itertools.takewhile(
    lambda x: x <= 4000000, fib()) if n % 2 == 0) 

Выход:

4613732 

Так что ваш код, даже если это не так (см другие ответы) происходит, чтобы дать правильный ответ.

0

Я пытаюсь решить ту же проблему - хотя я понимаю логику, чтобы сделать это, я не понимаю, почему это работает (выдает правильную сумму)

limit = 4000000 
s = 0 

l = [1,2] 
while l[-1]<limit: 
    n = l[-1]+l[-2] 
    l.append(n) 
    print n 

А потом то момент я ставлю в функции modulo больше ничего не выводит.

limit = 4000000 
s = 0 

l = [1,2] 
while l[-1]<limit: 
    n = l[-1]+l[-2] 
    if n % 2 == 0 : 
     l.append(n) 
     print n 

Я уверен, что это довольно просто ... спасибо!

0

Это код, который я использовал. Это очень полезно и учит вас об генераторах.

def fib(): 
     x,y = 0,1 
     while True: 
      yield x 
      x,y = y, x+y 

def even(seq): 
    for number in seq: 
     if not number % 2: 
      yield number 

def under_a_million(seq): 
    for number in seq: 
     if number > 4000000: 
      break 
     yield number 

print sum(even(under_a_million(fib()))) 

-M1K3

0

Держите это просто и должна вам менее 0,1 секунды.

from datetime import datetime 
x, y = 1, 1 
total = 0 
for i in xrange (1, 100): 
    x = x + y 
    if x % 2 == 0 and x <= 4000000: 
     total += x 
    y = y + x 
    if y % 2 == 0 and x <= 4000000: 
     total += y 

print total 

starttime = datetime.now() 
print datetime.now() - starttime