2012-04-19 4 views
0

У меня возникают проблемы с проблемой 2 на Project Euler. Цель состоит в том, чтобы найти сумму четных членов в последовательности Фибоначчи, значения которых не превышают четырех миллионов. По какой-то причине я продолжаю получать 0 в качестве вывода. Что я делаю не так?Project Euler # 2 - Python v3.2.3

total = 0 
count = 0 
term = 0 
fibonacciMemo = {0:0, 1:1} 

def main(): 
    term = fibonacci (count) 
    while (term <= 4000000): 
     if (term % 2 == 0): 
      total += term 
     count += 1 

def fibonacci (n): 
    if not n in fibonacciMemo: 
     fibonacciMemo [n] = fibonacci (n - 1) + fibonacci (n - 2) 
    return fibonacciMemo [n] 

print (total) 
+2

Вы исходите из фона Java или C? В python 'main' не вызывается автоматически. Вам нужно будет явно вызвать вашу функцию для ее выполнения. – Wilduck

+0

Да, у меня есть фон на C++. Я только начинаю подбирать Python. Приятно знать, что главное не автоматическое - спасибо. – JayJay1122

ответ

4

Некоторые вопросы:

  • Вы никогда не вызывая функцию main. Вы должны явно вызвать его для его выполнения.

  • присвоений переменных term, count, total в main не будет писать глобальные переменные. Вместо этого будут созданы отдельные локальные переменные с одинаковыми именами, а глобальные переменные все равно будут иметь значение 0 даже после вызова main.

    Один из способов исправить это, чтобы добавить линию global term, count, total в main. Но это плохой дизайн. Намного лучше удалить глобальные переменные (сделайте их локальными в main) и получите main, чтобы вернуть значение total. Затем отобразится результат print(main()).

  • Вы звоните только fibonacci один раз в main - вам нужно будет поместить это внутри цикла. В противном случае цикл будет работать бесконечно, так как term никогда не обновляется.

+0

Удивительный, спасибо! Он работает сейчас. – JayJay1122

3

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

total = 0 
count = 0 
term = 0 
fibonacciMemo = {0:0, 1:1} 

, а затем

print (total) 

Если вы хотите выполнить main, вы должны явно назвать, например, путем размещения main() перед print (total)

У вас есть еще одна проблема в вашем коде. Вы пытаетесь увеличить глобальную переменную total из функции. Это не сработает, если вы не объявите эту функцию global. Сделайте это, положив global total в функцию перед первым использованием всего. Та же проблема со счетом и термином. И, похоже, у вас есть проблема и в вашем потоке управления. Это не даст правильного ответа.

0

Добавьте эту строку в нижней части сценария:

if __name__ == "__main__": 
    main() 

Это будет вызывать main() при запуске файла в качестве сценария Python.

BTW есть намного лучшее решение проблемы Project Euler, вы можете генерировать четные термины Фибоначчи непосредственно вместо фильтрации. Сделайте привычку искать умные решения сейчас, или вы попадете в стену, когда проблемы станут сложными.

+0

А, ладно. Я даже не понял, что это было неэффективное решение. Благодаря! – JayJay1122