J'avais initialement mal codé le programme. Au lieu de renvoyer les nombres de Fibonacci entre une plage (c'est-à-dire. StartNumber 1, endNumber 20 devrait = uniquement les nombres entre 1 et 20), j'ai écrit pour que le programme affiche tous les nombres de Fibonacci entre une plage (c'est-à-dire. StartNumber 1, endNumber 20) affiche = 20 premiers nombres de Fibonacci). Je pensais avoir un code infaillible. Je ne vois pas non plus pourquoi cela se produit.
startNumber = int(raw_input("Enter the start number here "))
endNumber = int(raw_input("Enter the end number here "))
def fib(n):
if n < 2:
return n
return fib(n-2) + fib(n-1)
print map(fib, range(startNumber, endNumber))
Quelqu'un a souligné dans ma partie II (qui a été fermée pour être un double - /programming/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii ) que je besoin de passer le startNumber et endNumber à travers un générateur en utilisant une boucle while. Quelqu'un peut-il s'il vous plaît m'indiquer comment faire cela? Toute aide est la bienvenue.
Je suis un programmeur en apprentissage et je me suis heurté à un fouillis. On me demande d'écrire un programme qui calculera et affichera la séquence de Fibonacci par un numéro de début et un numéro de fin saisis par l'utilisateur (c'est-à-dire. StartNumber = 20 endNumber = 100 et il n'affichera que les nombres compris entre cette plage). L'astuce est de l'utiliser de manière inclusive (ce que je ne sais pas faire en Python? - Je suppose que cela signifie utiliser une plage inclusive?).
Ce que j'ai jusqu'à présent, ce n'est pas de codage réel mais plutôt:
- Ecrire la formule de séquence Fib à l'infini
- Afficher startNumber à endNumber uniquement à partir de la séquence Fib.
Je n'ai aucune idée par où commencer et je demande des idées ou un aperçu de la façon d'écrire ceci. J'ai aussi essayé d'écrire la séquence Fib forumla mais je m'y perds aussi.
int(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5)))
, des idées? @AndreaAmbun
est au-dessus de 70 et qu'elle explose avec unOverflowError
quandn
est légèrement au-dessus de 600. D'autres approches peuvent gérern
1000 ou plus sans souffler ou perdre de la précision.Générateur pythonique efficace de la séquence de Fibonacci
J'ai trouvé cette question en essayant d'obtenir la génération pythonique la plus courte de cette séquence (réalisant plus tard que j'en avais vu une similaire dans une proposition d'amélioration de Python ), et je n'ai remarqué personne d'autre proposer ma solution spécifique (bien que la première réponse se rapproche, mais encore moins élégant), alors le voici, avec des commentaires décrivant la première itération, car je pense que cela peut aider les lecteurs à comprendre:
et utilisation:
imprime:
(À des fins d'attribution, j'ai récemment remarqué une implémentation similaire dans la documentation Python sur les modules, même en utilisant les variables
a
etb
, que je me souviens maintenant d'avoir vu avant d'écrire cette réponse. Mais je pense que cette réponse démontre une meilleure utilisation du langage.)Implémentation définie de manière récursive
L' Encyclopédie en ligne des séquences entières définit la séquence de Fibonacci de manière récursive comme
La définition succincte de cela de manière récursive en Python peut être effectuée comme suit:
Mais cette représentation exacte de la définition mathématique est incroyablement inefficace pour les nombres bien supérieurs à 30, car chaque nombre en cours de calcul doit également calculer pour chaque nombre en dessous. Vous pouvez démontrer sa lenteur en utilisant ce qui suit:
Récursivité mémorisée pour plus d'efficacité
Il peut être mémorisé pour améliorer la vitesse (cet exemple tire parti du fait qu'un argument de mot-clé par défaut est le même objet à chaque fois que la fonction est appelée, mais normalement vous n'utiliseriez pas un argument par défaut mutable pour exactement cette raison):
Vous constaterez que la version mémorisée est beaucoup plus rapide et dépassera rapidement votre profondeur de récursivité maximale avant même de pouvoir penser à vous lever pour prendre un café. Vous pouvez voir à quel point il est visuellement plus rapide en faisant ceci:
(Il peut sembler que nous pouvons simplement faire ce qui suit, mais cela ne nous permet pas de profiter du cache, car il s'appelle lui-même avant que setdefault ne soit appelé.)
Générateur défini récursivement:
En apprenant Haskell, je suis tombé sur cette implémentation dans Haskell:
Le plus proche que je pense pouvoir arriver à cela en Python pour le moment est:
Cela le démontre:
Il ne peut cependant aller que jusqu'à la limite de récursivité. Habituellement, 1000, alors que la version Haskell peut aller jusqu'à des centaines de millions, bien qu'elle utilise les 8 Go de mémoire de mon ordinateur portable pour ce faire:
Consommer l'itérateur pour obtenir le nième numéro de fibonacci
Un commentateur demande:
La documentation itertools a une recette pour cela:
et maintenant:
la source
setdefault
appel est évaluée avant l'setdefault
est.Pourquoi ne pas simplement faire ce qui suit?
la source
L'idée derrière la séquence de Fibonacci est illustrée dans le code Python suivant:
Cela signifie que le fib est une fonction qui peut faire l'une des trois choses. Il définit fib (1) == 1, fib (0) == 0 et fib (n) comme:
fib (n-1) + fib (n-2)
Où n est un entier arbitraire. Cela signifie que fib (2), par exemple, se développe vers l'arithmétique suivante:
Nous pouvons calculer fib (3) de la même manière avec l'arithmétique ci-dessous:
La chose importante à réaliser ici est que fib (3) ne peut pas être calculé sans calculer fib (2), qui est calculé en connaissant les définitions de fib (1) et fib (0). Faire appeler une fonction comme le fait la fonction fibonacci s'appelle récursivité, et c'est un sujet important en programmation.
Cela ressemble à un devoir, donc je ne vais pas faire la partie début / fin pour vous. Python est un langage merveilleusement expressif pour cela, donc cela devrait avoir du sens si vous comprenez les mathématiques, et nous l'espérons, vous apprendra la récursivité. Bonne chance!
Edit: Une critique potentielle de mon code est qu'il n'utilise pas le rendement de la fonction Python super pratique, ce qui rend la fonction fib (n) beaucoup plus courte. Mon exemple est cependant un peu plus générique, car peu de langages en dehors de Python ont réellement du rendement.
la source
Complexité temporelle:
La fonction de mise en cache réduit la manière normale de calculer les séries de Fibonacci de O (2 ^ n) à O (n) en éliminant les répétitions dans l'arbre récursif de la série de Fibonacci:
Code:
la source
C'est assez efficace, en utilisant des opérations arithmétiques de base O (log n).
Celui-ci utilise des opérations arithmétiques de base O (1), mais la taille des résultats intermédiaires est grande et n'est donc pas du tout efficace.
Celui-ci calcule X ^ n dans l'anneau polynomial Z [X] / (X ^ 2 - X - 1) en utilisant l'exponentiation par quadrillage. Le résultat de ce calcul est le polynôme Fib (n) X + Fib (n-1), à partir duquel le nième nombre de Fibonacci peut être lu.
Encore une fois, cela utilise des opérations arithmétiques O (log n) et est très efficace.
la source
n -= 1
fonctionner correctement, et il ne fonctionne pas non plus avecn = 0
. Dans tous les cas, cela m'aiderait vraiment si beaucoup de contexte était ajouté pour expliquer leur fonctionnement, en particulier la première technique. Je vois que vous avez un message sur paulhankin.github.io/FibonacciCode Python canonique pour imprimer la séquence de Fibonacci:
Pour le problème "Imprimer le premier numéro de Fibonacci supérieur à 1000 chiffres":
la source
Nous savons que
Et que la puissance n-ième de cette matrice nous donne:
Nous pouvons donc implémenter une fonction qui calcule simplement la puissance de cette matrice à la n-ième puissance -1.
comme tout ce que nous savons, la puissance a ^ n est égale à
Donc à la fin la fonction fibonacci serait O (n) ... rien de vraiment différent d'une implémentation plus facile si ce n'était du fait que nous savons aussi que
x^n * x^n = x^2n
et l'évaluation dex^n
peut donc se faire avec la complexité O (log n )Voici mon implémentation fibonacci en utilisant le langage de programmation rapide:
Cela a la complexité O (log n). Nous calculons la puissance de Q avec l'exposant n-1 puis nous prenons l'élément m00 qui est Fn + 1 qui à l'exposant de puissance n-1 est exactement le n-ième nombre de Fibonacci que nous voulions.
Une fois que vous avez la fonction fibonacci rapide, vous pouvez itérer à partir du numéro de début et du numéro de fin pour obtenir la partie de la séquence de Fibonacci qui vous intéresse.
bien sûr, effectuez d'abord quelques vérifications au début et à la fin pour vous assurer qu'ils peuvent former une plage valide.
Je sais que la question a 8 ans, mais je me suis quand même amusé à y répondre. :)
la source
La suite de Fibonacci est la suivante :
1, 1, 2, 3, 5, 8, ...
.C'est
f(1) = 1
,f(2) = 1
,f(3) = 2
,...
,f(n) = f(n-1) + f(n-2)
.Ma mise en œuvre préférée (la plus simple et pourtant atteint une vitesse de la lumière par rapport aux autres implémentations) est la suivante:
Tester
Horaire
Edit: un exemple de visualisation pour ces implémentations.
la source
utiliser la récursivité:
la source
Une autre façon de faire:
Assigner une liste à 'a', assigner un entier à 'n' Map et réduire sont 2 des trois fonctions les plus puissantes de python. Ici, la carte sert uniquement à itérer «n-2» fois. a [-2:] obtiendra les deux derniers éléments d'un tableau. a.append (x + y) ajoutera les deux derniers éléments et s'ajoutera au tableau
la source
Tout cela a l'air un peu plus compliqué qu'il ne devrait l'être. Mon code est très simple et rapide:
la source
OK .. après avoir été fatigué de faire référence à toutes les longues réponses, trouvez maintenant le moyen ci-dessous pour implémenter Fibonacci en python. Vous pouvez l'améliorer comme vous le souhaitez en obtenant un argument ou en obtenant une entrée de l'utilisateur… ou en modifiant les limites de 10000. Selon vos besoins ……
Cette approche fonctionne également bien. Trouvez les analyses d'analyse ci-dessous
la source
c'est une amélioration de la réponse de mathew henry:
le code doit imprimer b au lieu d'imprimer c
sortie: 1,1,2,3,5 ....
la source
Utiliser la boucle for et n'imprimer que le résultat
Résultat
Imprimer le
list
contenant tous les nombresRésultat
la source
Résultats
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368 , 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 4334944320773, 701 , 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052789597512803, 2504730781961, 4052794587512803, 6542897597512883, 6528975965920881,
temps d'exécution: 0.04298138618469238
la source
il existe une méthode très simple pour s'en rendre compte!
vous pouvez exécuter ce code en ligne librement en utilisant http://www.learnpython.org/
la source
Cela peut être fait de la manière suivante.
la source
Juste pour le plaisir, dans Python 3.8+, vous pouvez utiliser une expression d'assignation (alias l'opérateur morse) dans une compréhension de liste, par exemple:
Une expression d'affectation vous permet d'attribuer une valeur à une variable et de la renvoyer dans la même expression. Par conséquent, l'expression
équivaut à exécuter
et renvoyer la valeur de
b
.la source
15 minutes après le début d'un tutoriel que j'ai utilisé lors de l'apprentissage de Python, il a demandé au lecteur d'écrire un programme qui calculerait une séquence de Fibonacci à partir de 3 nombres d'entrée (premier numéro de Fibonacci, deuxième numéro et numéro auquel arrêter la séquence). Le tutoriel n'avait couvert que les variables, if / thens, et les boucles jusqu'à ce point. Pas encore de fonctions. J'ai trouvé le code suivant:
Comme vous pouvez le voir, c'est vraiment inefficace, mais cela fonctionne.
la source
la source
eval(input())
n'est pas nécessaire ici; Je pense queint(input())
dans le cas, c'est mieux.Je viens de passer par http://projecteuler.net/problem=2, c'était mon point de vue
la source
la source
Peut-être que cela aidera
la source
basé sur la séquence classique de fibonacci et juste pour le plaisir des one-liners
si vous avez juste besoin du numéro de l'index, vous pouvez utiliser la réduction (même si réduire ce n'est pas le mieux adapté pour cela, cela peut être un bon exercice)
et pour obtenir le tableau complet, supprimez simplement ou (r.pop (0) et 0)
la source
Celui-ci, ça va? Je suppose que ce n'est pas aussi sophistiqué que les autres suggestions car cela nécessite la spécification initiale du résultat précédent pour produire la sortie attendue, mais je pense que c'est une option très lisible, c'est-à-dire que tout ce qu'elle fait est de fournir le résultat et le résultat précédent à la récursivité.
Voici le résultat:
la source
Fondamentalement traduit de Ruby:
...
la source
la source
Une explication plus détaillée du fonctionnement de la mémorisation pour la séquence de Fibonacci.
la source
J'essayais d'éviter une fonction récursive pour résoudre ce problème, j'ai donc adopté une approche itérative. Je faisais à l'origine une fonction récursive mémorisée mais j'ai continué à atteindre une profondeur récursive maximale. J'avais également des objectifs de mémoire stricts, donc vous me verrez garder le tableau aussi petit que possible pendant le processus de boucle en ne gardant que 2-3 valeurs dans le tableau à tout moment.
Obtenir le 6 millionième numéro de fibonacci prend environ 282 secondes sur ma machine tandis que le 600k fibonacci ne prend que 2,8 secondes. Je n'ai pas pu obtenir d'aussi grands nombres de fibonacci avec une fonction récursive, même mémorisée.
la source