Почему нет ответа при попытке сложить хотя бы числа Фибоначчи - PullRequest
0 голосов
/ 08 июня 2018

Я определил функцию для вычисления чисел Фибоначчи, которая работает хорошо.

Теперь я пытаюсь сложить все четные числа Фибоначчи <= n, которые также являются <= 4000000, но я не получаювывод. </p>

Может кто-нибудь уточнить, что я делаю не так?Спасибо!

def fib_iterative(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
    return a

def sum_even_fibs(n):
    total = 0
    n = 0
    while fib_iterative(n) < 4000000:
        if fib_iterative(n) % 2 == 0:
            total += fib_iterative(n)
            n += 1
    return total

print(sum_even_fibs(10))
# 1,1,2,3,5,8,13,21,34,55. 
# 2 + 8 + 34 = 44

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Ваш код не работает, потому что вы не делаете это до n, вы делаете это до 4000000.

Вы можете объединить обе свои функции, чтобы создать это.

def sum_even_fibs(n):
    a, b = 0, 1
    t = 0
    for i in range(n):
        a, b = b, a + b
        if a % 2 == 0:
            t += a
    return t

print(sum_even_fibs(10)) #44

, как указывал кто-то в комментариях, каждое третье число является четным, поэтому вы можете сжать его до

def sum_even_fibs(n):
    a, b = 0, 1
    t = 0
    for i in range(n // 3):
        a, b = a + 2 * b, 2 * a + 3 * b
        t += a
    return t

print(sum_even_fibs(10)) #44

для конкретного случая, когда вы не хотите делать какие-либо числа выше 4000000.Вы можете добавить это, если заявление

def sum_even_fibs(n):
    a, b = 0, 1
    t = 0
    for i in range(n // 3):
        a, b = a + 2 * b, 2 * a + 3 * b
        if a >= 4000000:
            print("the fibonacci numbers in this calculation exceed 4000000")
            return None
        t += a
    return t
0 голосов
/ 08 июня 2018

Допустим, вы просто делали это до n=5.Вы должны рассчитать пять чисел Фибоначчи.Вместо этого вы вычисляете все числа Фибоначчи до текущего три раза!Для каждого n вы должны вызывать fib_iterative ровно один раз и повторно использовать результат.Вы также отбрасываете значение вашего параметра n.

def sum_even_fibs(n):
    total = 0
    for x in range(n):
        current = fib_iterative(x)
        if current > 4000000:
            break
        if not current % 2:
            total += current
    return total

Это все еще неэффективно, потому что вы пересчитываете значения n-1 каждый раз, когда вызываете fib_iterative(n).Вместо этого решение на основе генератора позволит вам рассчитать каждое значение только один раз.

from itertools import takewhile

def fib(n):
    x = 0
    y = 1
    for _ in range(n):
        yield x
        x, y = y, x+y

def sum_even_fibs(n):
    fibs = fib(n)
    evens = (x for x in fibs if not x%2)
    less_than_4000000 = takewhile(lambda x: x < 4000000, evens)
    return sum(less_than_4000000)
0 голосов
/ 08 июня 2018

Что касается кода:

if fib_iterative(n) % 2 == 0:
    total += fib_iterative(n)
    n += 1

Это будет увеличивать только n, если n -ое число Фибоначчи является четным.Это означает, что как только вы достигнете 1, он станет бесконечным циклом.Если вы поместите print(n) непосредственно между операторами while и if, вы увидите это - он выведет 0, а затем довольно большое количество 1 с (предположительно, пока вам не надоест ипринудительно остановите его).

Чтобы исправить это, вам нужно вернуть n += 1 обратно на один уровень отступа, чтобы он увеличивался независимо от:

if fib_iterative(n) % 2 == 0:
    total += fib_iterative(n)
n += 1
...