Je dois créer un programme qui demande le nombre de nombres de Fibonacci imprimés, puis les imprimer comme 0, 1, 1, 2 ... mais je ne parviens pas à le faire fonctionner. Mon code a l'aspect suivant:
a = int(raw_input('Give amount: '))
def fib():
a, b = 0, 1
while 1:
yield a
a, b = b, a + b
a = fib()
a.next()
0
for i in range(a):
print a.next(),
Je voudrais utiliser cette méthode:
Python 2
a = int(raw_input('Give amount: '))
def fib(n):
a, b = 0, 1
for _ in xrange(n):
yield a
a, b = b, a + b
print list(fib(a))
Python 3
a = int(input('Give amount: '))
def fib(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
print(list(fib(a)))
Vous donnez a
trop de significations:
a = int(raw_input('Give amount: '))
vs.
a = fib()
Vous ne rencontrerez pas le problème (comme souvent) si vous donnez à vos variables des noms plus descriptifs (3 utilisations différentes du nom a
sur 10 lignes de code!):
amount = int(raw_input('Give amount: '))
et remplacez range(a)
par range(amount)
.
Puisque vous écrivez un générateur, pourquoi ne pas utiliser deux rendements, pour économiser en faisant le shuffle supplémentaire?
import itertools as it
num_iterations = int(raw_input('How many? '))
def fib():
a,b = 0,1
while True:
yield a
b = a+b
yield b
a = a+b
for x in it.islice(fib(), num_iterations):
print x
.....
Vous pouvez faire cela pour obtenir les nombres de fibonacci jusqu'à n'importe quel nombre (100 dans ce cas) avec le générateur.
def getFibonacci():
a, b = 0, 1
while True:
yield b
b = a + b
a = b - a
for num in getFibonacci():
if num > 100:
break
print(num)
Vous pouvez également essayer la solution de formulaire fermé (aucune garantie pour les très grandes valeurs de n en raison d’erreurs d’arrondi/dépassement de capacité):
root5 = pow (5, 0.5) ratio = (1 + root5)/2 def fib (n): return int ((pow (ratio, n) - pow (1 - ratio, n))/racine5)
def Fib(n):
i=a=0
b=1
while i<n:
print (a)
i=i+1
c=a+b
a=b
b=c
Fib(input("Please Enter the number to get fibonacci series of the Number : "))
Votre a
est un nom global à dire.
a = int(raw_input('Give amount: '))
Chaque fois que Python voit une a
, il pense que vous parlez de la précédente. Appeler quelque chose d'autre (ailleurs ou ici) devrait aider.
Python est un langage typé dynamiquement. le type d'une variable est déterminé au moment de l'exécution et il peut varier en fonction de l'exécution. Ici, dans un premier temps, vous avez déclaré un type entier, puis vous lui avez attribué une fonction. le type est maintenant devenu une fonction.
vous essayez d'appliquer ' a ' comme argument à range () function qui attend un argument, mais vous avez en fait fourni une variable de fonction comme argument.
le code corrigé devrait être
a = int(raw_input('Give amount: '))
def fib():
a, b = 0, 1
while 1:
yield a
a, b = b, a + b
b = fib()
b.next()
for i in range(a):
print b.next(),
ça va marcher
def fibonacci(n):
fn = [0, 1,]
for i in range(2, n):
fn.append(fn[i-1] + fn[i-2])
return fn
Vous avez eu la bonne idée et une solution très élégante, tout ce que vous avez à faire est d’échanger et d’ajouter la déclaration a et b. Votre relevé de rendement devrait également viser votre échange
a, b = b, a + b ####
devrait être a,b = a+b,a #####
`###yield a`
Aussi, vous pouvez utiliser énumérer infini générateur
for i,f in enumerate(fib()):
print i, f
if i>=n: break
Il semble que vous utilisiez la a
deux fois. Essayez de changer cela en un nom de variable différent.
Ce qui suit semble bien fonctionner pour moi.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a+b
f = fib()
for x in range(100):
print(f.next())
J'ai construit cela il y a quelque temps:
a = int(raw_input('Give amount: '))
fab = [0, 1, 1]
def fab_gen():
while True:
fab.append(fab[-1] + fab[-2])
yield fab[-4]
fg = fab_gen()
for i in range(a): print(fg.next())
Non, fab
augmentera avec le temps, ce n'est donc pas une solution parfaite.
j'aime cette version:
array = [0,1]
for i in range(20):
x = array[0]+array[1]
print(x)
array[0] = array[1]
array[1] = x