Нахождение суммы четных членов в последовательности Фибоначчи - PullRequest
6 голосов
/ 29 января 2012
#!/usr/bin/python2

"""
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, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
"""

odd, even = 0,1
total = 0
while True:
    odd = odd + even  #Odd
    even = odd + even     #Even
    if even < 4000000:
        total += even
    else:
        break
print total

Мой алгоритм:

  1. Если я возьму первые 2 числа за 0, 1; число, которое я найду первым в цикле while, будет нечетным числом и первым из ряда Фибоначчи.
  2. Таким образом, я вычисляю четное число и каждый раз добавляю значение четного к итоговому.
  3. Если значение even больше 4e6, я вырываюсь из бесконечного цикла.

Я так старался, но мой ответ всегда неверен. Гугл говорит, что ответ должен быть 4613732, но я всегда получаю 5702886

Спасибо за поддержку.

Ответы [ 16 ]

0 голосов
/ 05 июня 2014

проблема в вашем коде, в основном связанная со стилем цикла и проверкой синхронизации условий. с помощью алгоритма ниже, закодированного в java, вы можете найти (второй + первый) <4000000 проверок условий, и он даст вам правильный (который меньше 4000000) результат, с хорошим кодированием ... </p>

   int first = 0, second = 1, pivot = 0;

    do {

        if ((second + first) < 4000000) { // this is the point which makes your solution correct
          pivot = second + first;
          first = second;
          second = pivot;
          System.out.println(pivot);
        } else {
            break;
        }


    } while (true);
0 голосов
/ 29 декабря 2012

не уверен, что на ваш вопрос уже дан ответ или вы нашли решение, но вот что вы делаете неправильно.Задача состоит в том, чтобы найти четные термины, что означает, что вам нужно найти каждое значение в последовательности Фибоначчи, которое можно разделить на 2 без остатка.Проблема не просит вас найти каждое четное значение.Вот решение вашей проблемы, которое дает правильный ответ:

i = 1
total = 0
t = fib(i)
while t <= 4000000:
    t = fib(i)
    if t % 2 == 0:
        total += t
    i += 1
print total

По сути, вы перебираете каждое каждое значение в последовательности Фибоначчи, проверяя, является ли значение четным, используя 'mod' (оператор%) дляостаток, а затем, если это даже, вы добавляете его к сумме.

0 голосов
/ 29 января 2012

Каждый 3-й элемент в последовательности Фибоначчи является четным. Итак, вы могли бы иметь это:

prev, cur = 0, 1
count = 1
total = 0
while True:
    prev, cur = cur, prev + cur
    count = count + 1
    if cur >= 4000000:
        break
    if count % 3 == 0:
        total += cur
print(total)

или это (изменение вашего кода как можно меньше):

even, odd = 0,1                       # this line was corrected
total = 0
while True:
    secondOdd = even + odd                   # this line was changed
    even = odd + secondOdd     #Even         # this line was changed
    if even < 4000000:
        total += even
        odd = secondOdd + even               # this line was added
    else:
        break
print total

Другой способ (с помощью некоторой простой математики) проверить, что сумма a2+a5+a8+a11+...+a(3N+2) (сумма четных значений Фибоначчи) равна (a(3N+4)-1)/2. Таким образом, если вы можете рассчитать непосредственно это число, нет необходимости вычислять все предыдущие числа Фибоначчи.

0 голосов
/ 29 января 2012

Другие ответы верны, но учтите, что для добавления всех четных чисел в массив просто сделайте myarray = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

sum(map(lambda k:k if k%2 else 0, myarray))

или

sum([k if k%2 else 0 for k in [1,2,3,4,5]])
0 голосов
/ 29 января 2012

Если вы добавите каждое второе значение последовательности Фибоначчи, вы получите следующее значение Фибоначчи после последнего добавленного значения. Например:

f(0) + f(2) + f(4) = f(5)
0 + 1 + 3 + 8 = 13

Но ваш код в настоящее время не добавляет первое четное значение 1.

0 голосов
/ 29 января 2012

должно быть:

odd, even = 1,0

Кроме того, каждый третий номер является четным (четное + нечетное + нечетное = четное).

...