2010-10-17 47 views
12

Necesito hacer un programa que pida la cantidad de números de Fibonacci impresos y luego los imprima como 0, 1, 1, 2 ... pero no puedo hacer que funcione. Mi código es el siguiente:Generador de Python Fibonacci

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(), 
+1

creo 'mientras que True' es más concisa –

+0

¿Cómo puede la segunda iteración entienden "a = 1"? ¿No deberíamos escribir a = a + b en lugar de "a, b = b, a + b" – user177196

Respuesta

23

Usted está dando a demasiados significados:

a = int(raw_input('Give amount: ')) 

vs.

a = fib()  

No se quedará en el problema (como a menudo) si le da a sus variables nombres más descriptivos (3 usos diferentes del nombre a en 10 líneas de código!):

amount = int(raw_input('Give amount: ')) 

y cambie range(a) por range(amount).

2

Su a es un nombre global por así decirlo.

a = int(raw_input('Give amount: ')) 

Cada vez que ve un pitón a, que supone que usted está hablando de la anterior. Llamarlo de otra manera (en otro lugar o aquí) debería ayudar.

2

python es un lenguaje de tipeo dinámico. el tipo de variable se determina en tiempo de ejecución y puede variar a medida que la ejecución está en curso. Aquí, al principio, ha declarado que tiene un tipo entero y luego le ha asignado una función, por lo que su tipo ahora se convirtió en una función.

usted está tratando de aplicar 'un' como argumento para gama() función que espera y int arg pero que tiene en efecto proporcionado una variable de función como argumento.

el código corregido pues, deben

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(), 

esto funcionará

0

he construir este hace un tiempo:

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()) 

Sin fab que crecerá con el tiempo, por lo que ISN es una solución perfecta

17

me gustaría utilizar este método:

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))) 
1

También se puede usar enumerar generador infinita:

for i,f in enumerate(fib()): 
    print i, f 
    if i>=n: break 
2

También puede intentar la solución de forma cerrada (no hay garantías para valores muy grandes de n debido a errores de redondeo/desbordamiento):

 
root5 = pow(5, 0.5) 
ratio = (1 + root5)/2 

def fib(n): 
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5) 
13

Puesto que usted está escribiendo un generador, por qué no usar dos rendimientos, a ¿Guardar haciendo el shuffle extra?

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 

.....

1

Se tenía la idea correcta y una solución muy elegante, todo lo que necesita hacer es fijar el intercambio y la adición de declaración de a y b. Su estado de rendimiento debe ir después de su intercambio, así

a, b = b, a + b #### debería ser a,b = a+b,a #####

`###yield a` 
0

es como se hace con n = 50 aquí. Por supuesto, puede reemplazar el 50 por la entrada del usuario

def fibo(): 
    yield 1 
    yield 1 
    formerOfFormer = 1 
    former = 1 
    while True: 
     newVal = formerOfFormer + former 
     formerOfFormer = former 
     former = newVal 
     yield newVal 


generator = fibo() 
for i in xrange(50): 
    print generator.next() 
1
def fibonacci(n): 
    fn = [0, 1,] 
    for i in range(2, n): 
     fn.append(fn[i-1] + fn[i-2]) 
    return fn 
0

Para obtener los números de Fibonacci hasta cualquier número (100 en este caso) con el generador, se puede hacer esto.

def getFibonacci(): 
    yield 0 
    a, b = 0, 1 

    while True: 
     yield b 
     b = a + b 
     a = b - a 

for num in getFibonacci(): 
    if num > 100: 
     break 
    print(num) 
1

Una manera sencilla de imprimir serie de Fibonacci hasta el número n

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 : ")) 
0

Parece que está utilizando el a dos veces. Intenta cambiar eso a un nombre de variable diferente.

Lo siguiente parece estar funcionando bien para mí.

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()) 
0

me gusta esta versión:

array = [0,1] 

for i in range(20): 
    x = array[0]+array[1] 
    print(x) 
    array[0] = array[1] 
    array[1] = x 
Cuestiones relacionadas