Somme de la même nombres de fibonacci en dessous de 4 millions d' - Python
Je suis d'essayer le deuxième Projet Euler question en python et que vous voulez comprendre pourquoi mon code ne fonctionne pas.
Ce code est la somme de la même nombres de Fibonacci en dessous de 4 millions de
counter = 2
total = 0
while counter <= 4000000:
if counter % 2 == 0:
total+= counter
counter+= (counter -1)
print total
Ce code de sortie: 2
Si j'ai l'impression que le compteur c'sorties: 4194305
Je suis en supposant que c'est un problème avec le si de l'instruction en cours d'exécution comme le temps boucle fonctionne correctement et que le compteur est également l'incrémentation correctement.
- La réponse courte est que votre affirmation "Ce code est la somme de la même nombres de Fibonacci en dessous de 4 millions de dollars" est faux. Votre code ne semblent même pas essayer de le faire. Savez-vous ce qu'est un nombre de Fibonacci est, et la façon de calculer la série?
- Imprimer
counter
dans la boucle et vous verrez que vous n'obtenez pas de nombres de fibonacci. La série que vous obtenez est 3,5,9,17,33,65,... et ils sont tous impairs, ce qui signifie2
est le seul numéro est ajouté au total. - si vous utilisez un logiciel de débogage (essayez de PyCharm par exemple), vous pouvez arrêter une fonction comme celle-ci à l'intérieur de sa compilation et de vérification pour les valeurs intermédiaires. ensuite, vous avez facilement vu ce qui est mal.
Vous devez vous connecter pour publier un commentaire.
Le problème est dans la ligne de
counter+= (counter -1)
. Vous l'ajouter à lui-même (moins 1), tandis que vous devriez faire ceci:a
c'est le nombre de fibonacci (pasb
). On ne change pas latotal
bien (à cause de la façon dont il est construit).b
dans l'itération suivante. Dire queb
n'est pas un nombre de Fibonacci est un peu... bizarre.1 2 3 5..
au lieu de1 1 2 3 5 ..
(mais comme nous ne sommes pas en additionnant des nombres impairs, le total sera le même).La série de votre code calcule pour
counter
est comme suit:Vous ne pouvez pas simplement ajouter
counter - 1
à chaque fois, vous devez ajouter le précédent numéro de la série.Alors pourquoi est votre
total
si petit? En raison d'un nombre impair moins un est toujours la même, et d'un nombre impair, plus un nombre pair est toujours un nombre impair;2
est le seul nombre pair jamais vous générer, c'est donc votretotal
.La génération de la suite de Fibonacci est généralement fait avec deux variables
a
etb
, où nous commençons àet à chaque itération ressemble:
Si vous regardez attentivement, vous verrez la séquence suivante:
1 1 2 3 5 8 13 21 34 55 89 144 ...
La formule pour la cartographie de la suite de Fibonacci est:
Et que vous souhaitez seulement à la somme de la même nombres tels que:
1 1 2 3 5 8 13 21 34 55 89 144 ...
De sorte que vous pouvez mapper une nouvelle formule telle que:
Et vous permettra d'obtenir la séquence suivante:
2 8 34 144 ...
Exemple de Code (Go):
Dans ce cas, vous n'aurez pas besoin de le si conditionnel.
Espère que vous a aidé! Cheers!
Il y a des façons plus faciles de le faire (par exemple fantasque de la solution), mais cette version dit ce qu'il fait et fait ce qu'il dit 🙂
fibonacci
yield a
? Sinon, vous obtenez seulement un1
au début. Aussi,if not n % 2:
est plus pythonic.if not n % 2
n'est pas plus Pythonic depuis que nous sommes réellement désireux de savoir si elle est égale à numérique de zéro, et pas seulement si le résultat se trouve être contrainte/interprétable comme un booléen false. Je comprends où vous venez, maisn % 2 == 0
est idiomatiques même-ness de test.Eh bien, j'ai essayé de cette façon:
Quoi de mal à cela? C'est trop long à répondre, de script et de donner 'tué' erreur
Tout d'abord, vous devez générer tous les nombres de fibonacci ci-dessous 4000000 à l'aide de la formule récursive et pour chaque numéro, si c'est la même, que vous l'ajouter à la somme.
La formule:
a3
bien algorithmes est faux.
compteur est toujours impair, et bien c'est le même que dans le début. c'est la façon dont il va
2
3
5
9
17
et ainsi de suite.
total+= counter
n'est jamais exécuteVoici mon code Python. Je me sers de 2 choses. Tout d'abord, que le n-ième nombre de fibonacci peut être calculée comme suit:
Fibn = [φn-(1-φn)]/√5,
et le fait que même des numéros présente à tous les 3 le nombre de Fibonacci. Cela évite beaucoup de calculs inutiles!
Voici ma solution à ce problème:
De sortie: 4613732
L'algorithme doit être fixe. Dans votre code, vous n'êtes pas additionner les nombres de Fibonacci.
Ici est une version révisée: