Comment écrire la séquence de Fibonacci?

à l'origine, j'avais mal codé le programme. Au lieu de retourner les nombres de Fibonacci entre une gamme (ie. startNumber 1, endNumber 20 = uniquement les numéros entre 1 et 20), j'ai écrit pour le programme pour l'affichage de tous les nombres de Fibonacci entre une gamme (ie. startNumber 1, endNumber 20 affiche = 20 Premiers nombres de Fibonacci). Je pensais avoir un code de tir sûr. Aussi je ne vois pas pourquoi ce qui se passe.

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é pour être un duplicata - https://stackoverflow.com/questions/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii ) que je dois passer le startNumber et le endNumber à travers un générateur en utilisant une boucle while. Quelqu'un peut-il svp m'indiquer la direction sur la façon de faire cela? Toute aide est la bienvenue.


Je me demande d'écrire un programme qui computera et affichera la séquence de Fibonacci par un utilisateur entrant le numéro de début et le numéro de fin (c.-à-d. startNumber = 20 endNumber = 100 et il n'affichera que les nombres entre cette fourchette). Le truc est de l'utiliser de façon inclusive (ce que je ne sais pas faire en Python? - Je suppose que cela signifie d'utiliser un large éventail?).

ce que j'ai jusqu'à présent n'est pas un codage réel mais plutôt:

  • Écrire Fib séquence de formule à l'infini
  • afficher le numéro de début à la fin seulement à partir de la séquence Fib.

Je ne sais pas par où commencer et je demande des idées ou des idées sur la façon d'écrire ceci. J'ai aussi essayé d'écrire le Fib séquence forumla mais je me suis perdu.

110
demandé sur martineau 2009-01-30 08:49:13

30 réponses

il y a beaucoup d'informations sur la séquence de Fibonacci sur wikipedia et sur wolfram . Beaucoup plus que vous pourriez avoir besoin. Quoi qu'il en soit, il est bon d'apprendre à utiliser ces ressources pour trouver (rapidement si possible) ce dont vous avez besoin.

Écrire Fib séquence de formule à l'infini

En mathématiques, il est donné sous une forme récursive:

fibonacci from wikipedia

en programmation, infinite n'existe pas. Vous pouvez utiliser une forme récursive traduisant la forme mathématique directement dans votre langue, par exemple en Python elle devient:

def F(n):
    if n == 0: return 0
    elif n == 1: return 1
    else: return F(n-1)+F(n-2)

essayez-le dans votre langue préférée et voyez que ce formulaire nécessite beaucoup de temps que n devient plus grand. En fait, C'est O(2 n ) dans le temps.

allez sur les sites que je vous ai liés et allez voir ceci (sur wolfram ):

Fibonacci Equation

celui-ci est assez facile à mettre en œuvre et très, très rapide à calculer, en Python:

from math import sqrt
def F(n):
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

une autre façon de le faire est de suivre la définition (de wikipedia ):

le premier numéro de la séquence est 0, le deuxième nombre est 1, et chacun le nombre est égal à la somme des deux numéros précédents du séquence elle-même, cédant la séquence 0, 1, 1, 2, 3, 5, 8, etc.

si votre langue supporte des itérateurs, vous pouvez faire quelque chose comme:

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

afficher le numéro de début à la fin seulement à partir de la séquence Fib.

une fois que vous savez comment générer des nombres de Fibonacci, vous n'avez qu'à les parcourir et vérifier s'ils vérifier les conditions données.

supposons maintenant que vous avez écrit un f (n) qui renvoie le N-ème terme de la séquence de Fibonacci (comme celui avec sqrt(5))

dans la plupart des langues, vous pouvez faire quelque chose comme:

def SubFib(startNumber, endNumber):
    n = 0
    cur = f(n)
    while cur <= endNumber:
        if startNumber <= cur:
            print cur
        n += 1
        cur = f(n)

en python j'utiliserais la forme iterator et je dirais:

def SubFib(startNumber, endNumber):
    for cur in F():
        if cur > endNumber: return
        if cur >= startNumber:
            yield cur

for i in SubFib(10, 200):
    print i

Mon conseil est de apprendre à lire ce dont vous avez besoin. Projet Euler (google) va vous former à faire so: P Bonne chance et amusez-vous!

215
répondu Andrea Ambu 2017-09-08 12:47:10

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 (plus tard réalisant que j'avais vu une semblable dans un proposition D'amélioration de Python ), et je n'ai pas remarqué quelqu'un d'autre venir avec ma solution spécifique (bien que la réponse supérieure se rapproche, mais encore moins élégant), donc ici, avec des commentaires décrivant la première itération, parce que je pensez que cela peut aider les lecteurs à comprendre:

def fib():
    a, b = 0, 1
    while True:            # First iteration:
        yield a            # yield 0 to start with and then
        a, b = b, a + b    # a will now be 1, and b will also be 1, (0 + 1)

et usage:

for index, fibonacci_number in zip(range(10), fib()):
     print('{i:3}: {f:3}'.format(i=index, f=fibonacci_number))

imprime:

  0:   0
  1:   1
  2:   1
  3:   2
  4:   3
  5:   5
  6:   8
  7:  13
  8:  21
  9:  34
 10:  55

(à 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 et b , que je me souviens avoir vu avant d'écrire cette réponse. Mais je pense que cette réponse démontre une meilleure utilisation de la langue.)

définie de manière Récursive mise en œuvre

Le Online Encyclopedia of Integer sequences définit la Séquence de Fibonacci de manière récursive comme

F (n) = F (n-1) + F (n-2) avec F (0) = 0 et F (1) = 1

définition succincte de cette récursivité en Python peut être fait comme suit:

def rec_fib(n):
    '''inefficient recursive function as defined, returns Fibonacci number'''
    if n > 1:
        return rec_fib(n-1) + rec_fib(n-2)
    return n

mais ce la représentation exacte de la définition mathématique est incroyablement inefficace pour des nombres beaucoup plus grands que 30, parce que chaque nombre étant calculé doit également calculer pour chaque nombre au-dessous de lui. Vous pouvez démontrer sa lenteur en utilisant ce qui suit:

for i in range(40):
    print(i, rec_fib(i))

Memoized la récursivité pour plus d'efficacité

il peut être memoizé pour améliorer la vitesse (cet exemple tire avantage 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 ne voudriez pas utiliser une mutable argument par défaut pour cette raison):

def mem_fib(n, _cache={}):
    '''efficiently memoized recursive function, returns a Fibonacci number'''
    if n in _cache:
        return _cache[n]
    elif n > 1:
        return _cache.setdefault(n, mem_fib(n-1) + mem_fib(n-2))
    return n

vous trouverez la version memoized est beaucoup plus rapide, et dépassera rapidement votre profondeur maximale de récursion avant que vous ne pouvez même penser à se lever pour le café. Vous pouvez voir à quel point il est plus rapide visuellement en faisant ceci:

for i in range(40):
    print(i, mem_fib(i))

(il peut sembler que nous pouvons juste faire le ci-dessous, mais en fait il ne nous permet pas de profiter du cache, parce qu'il s'appelle lui-même avant que setdefault ne soit appelé.)

def mem_fib(n, _cache={}):
    '''don't do this'''
    if n > 1:  
        return _cache.setdefault(n, mem_fib(n-1) + mem_fib(n-2))
    return n

générateur défini de façon récursive:

comme J'ai appris Haskell, je suis tombé sur cette mise en œuvre à Haskell:

fib@(0:tfib) = 0:1: zipWith (+) fib tfib

le plus proche je pense que je peux obtenir à ce en Python en ce moment est:

from itertools import tee

def fib():
    yield 0
    yield 1
    # tee required, else with two fib()'s algorithm becomes quadratic
    f, tf = tee(fib()) 
    next(tf)
    for a, b in zip(f, tf):
        yield a + b

cela le démontre:

[f for _, f in zip(range(999), fib())]

il ne peut aller jusqu'à la limite de la récursivité. Habituellement, 1000, alors que la version Haskell peut aller jusqu'à 100s de millions, bien qu'il utilise les 8 Go de la mémoire de mon ordinateur portable pour le faire:

> length $ take 100000000 fib 
100000000
45
répondu Aaron Hall 2018-04-19 23:10:42

Pourquoi ne pas simplement faire ce qui suit?

x = [1,1]
for i in range(2, 10):  
    x.append(x[-1] + x[-2]) 
print(', '.join(str(y) for y in x))
22
répondu Thomas Spycher 2018-09-21 15:51:00

l'idée derrière la séquence de Fibonacci est montrée dans le code Python suivant:

def fib(n):
   if n == 1:
      return 1
   elif n == 0:   
      return 0            
   else:                      
      return fib(n-1) + fib(n-2)         

cela signifie que fib est une fonction qui peut faire l'une des trois choses. Il définit fib(1) == 1, fib(0) == 0, et fib(n):

fib(n-1) + fib (n-2)

Où n est un entier arbitraire. Cela signifie que fib(2) par exemple, se développe à l'arithmétique suivante:

fib(2) = fib(1) + fib(0)
fib(1) = 1
fib(0) = 0
# Therefore by substitution:
fib(2) = 1 + 0
fib(2) = 1

on peut calculer fib (3) de la même façon que pour le calcul indiqué ci-dessous:

fib(3) = fib(2) + fib(1)
fib(2) = fib(1) + fib(0)
fib(2) = 1
fib(1) = 1
fib(0) = 0
# Therefore by substitution:
fib(3) = 1 + 1 + 0

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). Avoir une fonction qui s'appelle elle-même comme la fonction fibonacci le fait est appelé récursion, et c'est un sujet important dans la 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 cependant, donc cela devrait avoir du sens si vous comprenez les mathématiques, et nous espérons vous enseigner sur la récursion. Bonne chance!

Edit: une critique potentielle de mon code est qu'il n'utilise pas la fonction Python de rendement super-maniable, ce qui rend la fonction fib(n) Beaucoup plus courte. Mon exemple est un peu plus générique cependant, puisque peu de langues en dehors de Python ont réellement du rendement.

20
répondu James Thompson 2009-01-30 06:15:45

complexité temporelle:

la caractéristique de mise en cache réduit la façon normale de calculer la série 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:

enter image description here

Code:

import sys

table = [0]*1000

def FastFib(n):
    if n<=1:
        return n
    else:
        if(table[n-1]==0):
            table[n-1] = FastFib(n-1)
        if(table[n-2]==0):
            table[n-2] = FastFib(n-2)
        table[n] = table[n-1] + table[n-2]
        return table[n]

def main():
    print('Enter a number : ')
    num = int(sys.stdin.readline())
    print(FastFib(num))

if __name__=='__main__':
    main()
10
répondu Akash Rana 2014-09-30 10:25:25

c'est assez efficace, en utilisant O(log n) opérations arithmétiques de base.

def fib(n):
    return pow(2 << n, n + 1, (4 << 2*n) - (2 << n) - 1) % (2 << n)

celui-ci utilise O(1) opérations arithmétiques de base, mais la taille des résultats intermédiaires est grande et donc pas du tout efficace.

def fib(n):
    return (4 << n*(3+n)) // ((4 << 2*n) - (2 << n) - 1) & ((2 << n) - 1)

celui - ci calcule X^n dans le cycle polynomial Z[X] / (X^2 - X-1) en utilisant l'exponentiation par quadrature. Le résultat de ce calcul est le polynôme Fib(n)X + Fib(n-1), à partir duquel le nième Fibonacci le numéro peut être lu.

encore une fois, cela utilise O(log n) opérations arithmétiques et est très efficace.

def mul(a, b):
        return a[0]*b[1]+a[1]*b[0]+a[0]*b[0], a[0]*b[0]+a[1]*b[1]

def fib(n):
        x, r = (1, 0), (0, 1)
        while n:
                if n & 1: r = mul(r, x)
                x = mul(x, x)
                n >>= 1
        return r[0]
8
répondu Paul Hankin 2016-06-02 07:47:03

code Python canonique pour imprimer la séquence de Fibonacci:

a,b=1,1
while(True):
  print a,
  a,b=b,a+b       # Could also use b=a+b;a=b-a

Pour le problème de "Impression le premier nombre de Fibonacci de plus de 1000 chiffres":

a,b=1,1
i=1
while(len(str(a))<=1000):
  i=i+1
  a,b=b,a+b

print i,len(str(a)),a
6
répondu DaVinci 2014-02-06 15:39:57

utiliser pour boucle et imprimer juste le résultat

def fib(n:'upto n number')->int:
    if n==0:
        return 0
    elif n==1:
        return 1
    a=0
    b=1
    for i in range(0,n-1):
        b=a+b
        a=b-a
    return b

résultat

>>>fib(50)
12586269025
>>>>
>>> fib(100)
354224848179261915075
>>> 

imprimer le list contenant tous les numéros

def fib(n:'upto n number')->int:
    l=[0,1]
    if n==0:
        return l[0]
    elif n==1:
        return l
    a=0
    b=1
    for i in range(0,n-1):
        b=a+b
        a=b-a
        l.append(b)
    return l

résultat

>>> fib(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
3
répondu user2728397 2016-11-04 16:24:24

il y a une méthode très simple pour réaliser cela!

vous pouvez exécuter ce code en ligne gratuitement en utilisant http://www.learnpython.org /

# Set the variable brian on line 3!

def fib(n):
"""This is documentation string for function. It'll be available by fib.__doc__()
Return a list containing the Fibonacci series up to n."""
result = []
a = 0
b = 1
while a < n:
    result.append(a)  # 0 1 1 2 3 5  8  (13) break
    tmp_var = b       # 1 1 2 3 5 8  13
    b = a + b         # 1 2 3 5 8 13 21
    a = tmp_var       # 1 1 2 3 5 8  13
    # print(a)
return result

print(fib(10))
# result should be this: [0, 1, 1, 2, 3, 5, 8]
3
répondu xgqfrms 2018-01-02 15:52:50

use récursion:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
x=input('which fibonnaci do you want?')
print fib(x)
3
répondu user2095044 2018-01-23 15:17:19

nous savons que

enter image description here

et que la puissance n-e de cette matrice nous donne:

enter image description here

donc nous pouvons implémenter une fonction qui calcule simplement la puissance de cette matrice à la puissance n-th -1.

comme tout ce que nous savons, la puissance est égale à

enter image description here

ainsi à la fin la fonction fibonacci serait O( n )... rien de vraiment différent d'une mise en œuvre plus facile si ce n'était pas pour le fait que nous savons aussi que x^n * x^n = x^2n et l'évaluation de x^n peut donc être fait avec la complexité O( log n )

Voici mon implémentation fibonacci en utilisant le langage de programmation swift:

struct Mat {
    var m00: Int
    var m01: Int
    var m10: Int
    var m11: Int
}

func pow(m: Mat, n: Int) -> Mat {
    guard n > 1 else { return m }
    let temp = pow(m: m, n: n/2)

    var result = matMultiply(a: temp, b: temp)
    if n%2 != 0 {
        result = matMultiply(a: result, b: Mat(m00: 1, m01: 1, m10: 1, m11: 0))
    }
    return result
}

func matMultiply(a: Mat, b: Mat) -> Mat {
    let m00 = a.m00 * b.m00 + a.m01 * b.m10
    let m01 = a.m00 * b.m01 + a.m01 * b.m11
    let m10 = a.m10 * b.m00 + a.m11 * b.m10
    let m11 = a.m10 * b.m01 + a.m11 * b.m11

    return Mat(m00: m00, m01: m01, m10: m10, m11: m11)
}

func fibonacciFast(n: Int) -> Int {

    guard n > 0 else { return 0 }
    let m = Mat(m00: 1, m01: 1, m10: 1, m11: 0)

    return pow(m: m, n: n-1).m00
}

complexité O (log n). Nous calculons la puissance de Q avec l'exposant n-1 et ensuite nous prenons l'élément m00 qui est Fn+1 qui à la puissance exposant n-1 est exactement le N-ème nombre de Fibonacci que nous voulions.

une fois que vous avez la fonction fibonacci rapide, vous pouvez itérer à partir du nombre de début et de fin pour obtenir la partie de la séquence de Fibonacci qui vous intéresse.

let sequence = (start...end).map(fibonacciFast)

bien sûr d'abord effectuer un certain contrôle sur le début et la fin pour s'assurer qu'ils peuvent former une plage valide.

je sais que la question a 8 ans, mais j'ai quand même eu du plaisir à y répondre. :)

3
répondu Giuseppe Lanza 2018-01-26 10:45:27
def fib():
    a,b = 1,1
    num=eval(input("Please input what Fib number you want to be calculated: "))
    num_int=int(num-2)
    for i in range (num_int):
        a,b=b,a+b
    print(b)
2
répondu AlexB 2012-08-06 14:19:34

Ces air un peu plus compliquées qu'elles ne devraient l'être. Mon code est très simple et rapide:

def fibonacci(x):

    List = []
    f = 1
    List.append(f)
    List.append(f) #because the fibonacci sequence has two 1's at first
    while f<=x:
        f = List[-1] + List[-2]   #says that f = the sum of the last two f's in the series
        List.append(f)
    else:
        List.remove(List[-1])  #because the code lists the fibonacci number one past x. Not necessary, but defines the code better
        for i in range(0, len(List)):
        print List[i]  #prints it in series form instead of list form. Also not necessary
2
répondu Timmy 2014-02-02 04:59:00

une autre façon de le faire:

a,n=[0,1],10
map(lambda i: reduce(lambda x,y: a.append(x+y),a[-2:]),range(n-2))

Affectation de liste aux "a", l'attribution entier "n" Map et reduce sont deux des trois fonctions les plus puissantes de python. Ici la carte est utilisée juste pour itérer' n-2 ' fois. un[-2:] aura le dernier deux éléments d'un tableau. A. ajouter (x+y) ajoutera les deux derniers éléments et ajoutera au tableau

2
répondu sanooj 2014-06-13 18:17:07

OK.. après avoir été fatigué de faire référence à toutes les réponses longues, maintenant trouver le tri ci-dessous et douce, assez simple pour mettre en œuvre Fibonacci en python. Vous pouvez l'améliorer de la façon que vous voulez en obtenant un argument ou en obtenant l'entrée d'utilisateur...ou changer les limites de 10000. Comme vous en avez besoin......

def fibonacci():
    start = 0 
    i = 1 
    lt = []
    lt.append(start)
    while start < 10000:
        start += i
        lt.append(start)
        i = sum(lt[-2:])
        lt.append(i)
    print "The Fibonaccii series: ", lt

cette approche donne également de bons résultats. Trouver les statistiques d'exécution ci-dessous

In [10]: %timeit fibonacci
10000000 loops, best of 3: 26.3 ns per loop
2
répondu Haroon Rashedu 2015-11-01 04:35:36
import time
start_time = time.time()



#recursive solution
def fib(x, y, upperLimit):
    return [x] + fib(y, (x+y), upperLimit) if x < upperLimit else [x]

#To test :

print(fib(0,1,40000000000000))
print("run time: " + str(time.time() - start_time))

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, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853]

durée: 0.04298138618469238

2
répondu nathan rogers 2016-11-23 22:02:39

essentiellement traduit de Ruby:

def fib(n):
    a = 0
    b = 1
    for i in range(1,n+1):
            c = a + b
            print c
            a = b
            b = c

...

1
répondu Matthew Smith 2015-10-22 23:09:13
def fib(lowerbound, upperbound):
    x = 0
    y = 1
    while x <= upperbound:
        if (x >= lowerbound):
            yield x
        x, y = y, x + y

startNumber = 10
endNumber = 100
for fib_sequence in fib(startNumber, endNumber):
    print "And the next number is... %d!" % fib_sequence
1
répondu JayL 2015-11-12 19:35:53

suite de Fibonacci est: 1, 1, 2, 3, 5, 8, ... .

C'est-à-dire f(1) = 1 , f(2) = 1 , f(3) = 2 , ... , f(n) = f(n-1) + f(n-2) .

mon implémentation préférée (la plus simple et pourtant atteint une vitesse de lumière par rapport à d'autres implémentations) est celle-ci:

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

Test

>>> [fibonacci(i) for i in range(1, 10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34]

"1519160920 de" Timing

>>> %%time
>>> fibonacci(100**3)
CPU times: user 9.65 s, sys: 9.44 ms, total: 9.66 s
Wall time: 9.66 s

Edit: un exemple de visualisation pour cette mise en œuvre.

1
répondu Aziz Alto 2016-03-14 09:39:21

la récursion ajoute du temps. Pour éliminer les boucles, d'abord import math . Ensuite, utilisez math.sqrt et ratio d'or dans une fonction:

#!/usr/bin/env python3

import math

def fib(n):
    gr = (1 + math.sqrt(5)) / 2
    fib_first = (gr**n - (1 - gr)**n) / math.sqrt(5)
    return int(round(fib_first))

fib_final = fib(100)

print(fib_final)

ref: Nombres de Fibonacci en Python

1
répondu noobninja 2016-08-29 20:23:11

c'est une amélioration à la réponse de mathew henry:

def fib(n):
    a = 0
    b = 1
    for i in range(1,n+1):
            c = a + b
            print b
            a = b
            b = c

le code doit être imprimé b au lieu de c

sortie: 1,1,2,3,5 ....

1
répondu adongo 2016-09-01 17:21:27

C'est la plus simple en python pour les séries de Fibonacci mais ajustée [0] dans le tableau de sortie par append() pour aboutir à la deuxième variable de la liste de résultats qui est result.append(second)

def fibo(num):
    first = 0
    second = 1
    result = [0]
    print('Fibonacci series is')
    for i in range(0,num):
        third = first + second
        #print(second)
        result.append(second)
        first = second
        second = third
    print(result)
    return
fibo(7)

sortie

Fibonacci series is
[0, 1, 1, 2, 3, 5, 8, 13]
1
répondu Vrushal Raut 2017-05-17 08:24:28

allez trouver comment convertir un problème récursif en un problème itératif. On devrait pouvoir calculer à partir de là.

Que pourraient être les principes qu'ils essayent de vous apprendre, surtout si c'est un des Algorithmes de parcours.

0
répondu Calyth 2009-01-30 07:45:25

15 minutes après 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 numéros d'entrée (premier numéro de Fibonacci, deuxième numéro, et numéro auquel arrêter la séquence). Le tutoriel ne couvrait que les variables, if/thens, et les boucles jusqu'à ce point. Pas de fonctions encore. J'ai trouvé le code suivant:

sum = 0
endingnumber = 1                

print "\n.:Fibonacci sequence:.\n"

firstnumber = input("Enter the first number: ")
secondnumber = input("Enter the second number: ")
endingnumber = input("Enter the number to stop at: ")

if secondnumber < firstnumber:

    print "\nSecond number must be bigger than the first number!!!\n"

else:

while sum <= endingnumber:

    print firstnumber

    if secondnumber > endingnumber:

        break

    else:

        print secondnumber
        sum = firstnumber + secondnumber
        firstnumber = sum
        secondnumber = secondnumber + sum

comme vous pouvez le voir, c'est vraiment inefficace, mais ça marche.

0
répondu Jonas 2011-10-24 07:53:33

passer à travers http://projecteuler.net/problem=2 c'était mon prendre sur elle

# Even Fibonacci numbers
# Problem 2

def get_fibonacci(size):
    numbers = [1,2]
    while size > len(numbers):
        next_fibonacci = numbers[-1]+numbers[-2]
        numbers.append(next_fibonacci)

    print numbers

get_fibonacci(20)
0
répondu Filype 2013-09-12 11:53:24
def fib(x, y, n):
    if n < 1: 
        return x, y, n
    else: 
        return fib(y, x + y, n - 1)

print fib(0, 1, 4)
(3, 5, 0)

#
def fib(x, y, n):
    if n > 1:
        for item in fib(y, x + y, n - 1):
            yield item
    yield x, y, n

f = fib(0, 1, 12)
f.next()
(89, 144, 1)
f.next()[0]
55
0
répondu jdsantiagojr 2013-11-24 06:23:04

c'était un devoir de pratique que J'ai vu sur le Sal de Khan Academy sur la programmation Python: https://www.khanacademy.org/science/computer-science-subject/computer-science/v/exercise---write-a-fibonacci-function

Il n'est probablement pas la première personne à céder que peu de travail à faire. Mais c'est génial de le découvrir tout seul. J'ai beaucoup appris à le comprendre et c'était génial.

je vous recommande débrouillez-vous avant d'essayer de copier le code de quelqu'un d'autre pour vos devoirs.

dans la vidéo ci-dessus, Sal l'instructeur, montre toute la théorie derrière le nombre de Fibonacci, et avec cela à l'Esprit, vous devriez être en mesure de comprendre.

cela m'a pris environ 10 minutes et c'est le code que j'ai créé (j'apprends Python depuis 3 jours et c'est mon premier langage de programmation À APPRENDRE). Je n'aurais pas pu écrire le code s'il n'était pas pour la vidéo du tutoriel avant: https://www.khanacademy.org/science/computer-science-subject/computer-science/v/comparing-iterative-and-recursive-factorial-functions que l'on donne un exemple de Sal faisant une équation factorielle récursive et vous donne l'état d'esprit pour résoudre ce problème.

Voici mon code:

def fibonacci(num):
    if num <= 1:          #base case
        return num
    else:
        return fibonacci(num-1) + fibonacci(num-2)

Vous pouvez voir que si le nombre est 1 ou 0, puis vous retournez simplement le nombre.

je trouve cela plus propre que de dire si le nombre est 1 retourner 1 et si le nombre est 0 retourner 0.

0
répondu aaron-coding 2014-01-28 07:52:38

peut-être que cela aidera

def fibo(n):
    result = []
    a, b = 0, 1
    while b < n:
            result.append(b)
            a, b = b, b + a
    return result
0
répondu Van Gogh 2014-07-09 09:45:49

essayez ceci:

def nth_fib(n):
    if n == 0:
        return 1
    elif n == 1:
        return 0
    else:
        return nth_fib(n - 1) + nth_fib(n - 2)
0
répondu wadadaaa 2014-12-07 15:20:13

basé sur la séquence classique de fibonacci et juste pour le bien des monocouches

si vous avez juste besoin du numéro de l'index, vous pouvez utiliser le réduire (même si réduire il n'est pas mieux adapté pour cela, il peut être un bon exercice)

def fibonacci(index):
    return reduce(lambda r,v: r.append(r[-1]+r[-2]) or (r.pop(0) and 0) or r , xrange(index), [0, 1])[1]

et pour obtenir le tableau complet il suffit de supprimer le ou (r. pop (0) et 0)

reduce(lambda r,v: r.append(r[-1]+r[-2]) or r , xrange(last_index), [0, 1])
0
répondu Kadmillos 2015-02-11 18:01:18