def fibonacci(n):
    first = 0
    second = 1
    count = 0
    while count <= n:
        if (second % 2 == 0):
            first, second = second, first + second
            count += 1
    return first, second

print (fibonacci(4000000))

Quelqu'un peut-il expliquer ce qui ne va pas avec ce code? Dans IDLE, la page redémarre mais ne renvoie aucune réponse. Soit dit en passant, je suis un programmeur débutant, je viens juste de terminer le cours CodeAcademy.

-2
Kor13 10 juil. 2015 à 20:10

4 réponses

Meilleure réponse

Étant donné que cela concerne le problème 2 du projet Euler, vous calculez les valeurs incorrectes. Il demande la somme de tous les nombres pairs de Fibonacci jusqu'à une valeur de quatre millions, et non la quatre millionième valeur. Ce serait trop grand.

Puisque nous voulons continuer à générer des valeurs, nous utiliserons un générateur et le combinerons avec itertools.takewhile(). Ensuite, nous allons filter() jusqu'aux valeurs paires et recherchez le sum().

import itertools

def fibonacci_gen():
    first = 0
    second = 1
    while 1:
        first, second = second, first + second
        yield second
>>> a = fibonacci_gen()
>>> sum(filter(lambda y: not y%2, itertools.takewhile(lambda x: x<=4e6, a)))
4613732

Pour une solution qui n'utilise pas ces fonctionnalités:

def fibonacci_4m():
    result = 0
    first = 0
    second = 1
    while second <= 4e6:
        first, second = second, first + second
        if not second%2:
            result += second
    return result
>>> fibonacci_4m()
4613732
0
TigerhawkT3 10 juil. 2015 à 22:48

Votre problème est que vous avez votre variable de compte à l'intérieur de l'instruction if. Vous avez créé une boucle while infinie. Déplacez-le en dehors de l'instruction if:

    if(second % 2 == 0):
        first, second = second, first + second
    count +=1

Vous devrez également ajouter plus de code pour que cela fonctionne correctement.

0
jfish003 10 juil. 2015 à 17:26

Dans votre boucle while, rien ne change lorsque l'instruction if ne parvient pas à exécuter son code conditionnel. Essayez plutôt ce qui suit:

def main():
    for index in range(1, 41):
        print('even_fibonacci({}) = {}'.format(index, even_fibonacci(index)))

def even_fibonacci(index):
    for number in all_fibonacci():
        if not number & 1:
            index -= 1
            if not index:
                return number

def all_fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

if __name__ == '__main__':
    main()
0
Noctis Skytower 10 juil. 2015 à 17:38

second % 2 commence par 1, ce qui n'est pas étrange. Par conséquent, votre boucle while n'exécute rien dans le corps, donc la boucle s'exécute indéfiniment.

Vous voulez probablement toujours calculer le prochain nombre de Fibonacci, mais incrémenter le nombre uniquement si le second est pair.

0
nneonneo 10 juil. 2015 à 17:16