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
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.
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
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.
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]
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
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))
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
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.
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
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)
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