web-dev-qa-db-fra.com

Un algorithme itératif pour les nombres de Fibonacci

Je suis intéressé par un algorithme itératif pour les nombres de Fibonacci, j'ai donc trouvé la formule sur wiki ... il semble simple donc je l'ai essayé en Python ... il n'a pas de problème de compilation et la formule semble correcte ... pas sûr pourquoi son donnant la mauvaise sortie ... ne l'ai-je pas implémenté correctement

def fib (n): 
    if( n == 0):
        return 0
    else:
        x = 0
        y = 1
        for i in range(1,n):
            z = (x + y)
            x = y
            y = z
            return y

for i in range(10):
    print (fib(i))

production


Aucun
1
1
1
1
1
1

15
Ris

Le problème est que votre return y est dans la boucle de votre fonction. Ainsi, après la première itération, il s'arrêtera déjà et renverra la première valeur: 1. Sauf lorsque n vaut 0, auquel cas la fonction est faite pour renvoyer 0 lui-même, et dans le cas où n vaut 1, lorsque la boucle for ne répétera pas une seule fois, et qu'aucune return ne sera exécutée (d'où la valeur de retour None).

Pour résoudre ce problème, déplacez simplement le return y en dehors de la boucle.

Mise en œuvre alternative

En suivant l'exemple de KebertX, voici une solution que je ferais personnellement en Python. Bien sûr, si vous deviez traiter de nombreuses valeurs de Fibonacci, vous pourriez même vouloir combiner ces deux solutions et créer un cache pour les nombres.

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

Vous retournez une valeur dans une boucle, donc la fonction se termine avant que la valeur de y ne soit jamais supérieure à 1.

Si je peux suggérer quelque chose de plus court et de beaucoup plus python:

def fibs(n):                                                                                                 
    fibs = [0, 1, 1]                                                                                           
    for f in range(2, n):                                                                                      
        fibs.append(fibs[-1] + fibs[-2])                                                                         
    return fibs[n]

Cela fera exactement la même chose que votre algorithme, mais au lieu de créer trois variables temporaires, il les ajoute simplement dans une liste et retourne le nième numéro de fibonacci par index.

4
KebertX

Séquence de Fibonacci non récursive en python

def fibs(n):
    f = []
    a = 0
    b = 1
    if n == 0 or n == 1:
        print n
    else:
        f.append(a)
        f.append(b)
        while len(f) != n:
            temp = a + b
            f.append(temp)
            a = b
            b = temp

    print f

fibs(10)

Sortie: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

1
karuna

Sur fib (0), vous retournez 0 car:

if (n == 0) {
    return 0;
}

Sur fib (1), vous retournez 1 car:

y = 1
return y

Sur la figure (2), vous retournez 1 car:

y = 1
return y

...etc. Aussi longtemps que return y est à l'intérieur de votre boucle, la fonction se termine à la première itération de votre boucle for à chaque fois.

Voici une bonne solution proposée par un autre utilisateur: Comment écrire la séquence de Fibonacci en Python

1
John Hornsby

Une autre approche possible:

a=0
b=1
d=[a,b]
n=int(input("Enter a number"))
i=2
while i<n:
    e=d[-1]+d[-2]
    d.append(e)
    i+=1
print("Fibonacci series of {} is {}".format(n,d))
0
Loki

Ce travail ( intuitivement )

def fib(n):
    if n < 2:
        return n
    o,i = 0,1
    while n > 1:
        g = i
        i = o + i
        o = g
        n -= 1
    return i
0
MsO

Que diriez-vous de ce moyen simple mais plus rapide ... (je viens de découvrir!)

def fib(n):
    x = [0,1]
    for i in range(n >> 1):
        x[0] += x[1]
        x[1] += x[0]
    return x[n % 2]

Remarque! par conséquent, cet algorithme simple utilise uniquement 1 affectation et 1 ajout, car la longueur de boucle est raccourcie à 1/2 et chaque boucle comprend 2 affectations et 2 ajouts.

0
digitect38
fcount = 0 #a count recording the number of Fibonacci numbers generated
prev = 0
current = 0
next = 1
ll = 0 #lower limit
ul = 999 #upper limit

while ul < 100000:
    print("The following Fibonacci numbers make up the chunk between %d and %d." % (ll, ul))
    while next <= ul:
        print(next)
        prev = current
        current = next
        next = prev + current
        fcount += 1 #increments count

    print("Number of Fibonacci numbers between %d and %d is %d. \n" % (ll, ul, fcount))        
    ll = ul + 1 #current upper limit, plus 1, becomes new lower limit
    ul += 1000 #add 1000 for the new upper limit
    fcount = 0 #set count to zero for a new batch of 1000 numbers
0
Jedi_Jezzi
def fibiter(n):
    f1=1
    f2=1
    tmp=int()
    for i in range(1,int(n)-1):
        tmp = f1+f2
        f1=f2
        f2=tmp
    return f2

ou avec affectation parallèle:

def fibiter(n):
    f1=1
    f2=1
    for i in range(1,int(n)-1):
        f1,f2=f2,f1+f2
    return f2

fibrer d'impression (4)

0
Andrei Volokitin

Je suis tombé sur cela sur n autre fil et c'est beaucoup plus rapide que tout ce que j'ai essayé et ne va pas expirer sur de grands nombres. Voici un lien pour les mathématiques.

def fib(n):
    v1, v2, v3 = 1, 1, 0  
    for rec in bin(n)[3:]: 
        calc = v2*v2
        v1, v2, v3 = v1*v1+calc, (v1+v3)*v2, calc+v3*v3
        if rec=='1':    v1, v2, v3 = v1+v2, v1, v2
    return v2
0
user3464678