Python генератор Фибоначчи - PullRequest
       3

Python генератор Фибоначчи

14 голосов
/ 17 октября 2010

Мне нужно создать программу, которая запрашивает количество напечатанных чисел Фибоначчи, а затем печатает их как 0, 1, 1, 2 ... но я не могу заставить ее работать. Мой код выглядит следующим образом:

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

Ответы [ 15 ]

26 голосов
/ 17 октября 2010

Я бы использовал этот метод:

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)))
24 голосов
/ 17 октября 2010

Вы даете a слишком много значений:

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

против

a = fib()       

Вы не столкнетесь с проблемой (как часто), если дадите свои переменныеболее описательные имена (3 различных использования имени a в 10 строках кода!):

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

и изменение range(a) на range(amount).

13 голосов
/ 18 октября 2010

Поскольку вы пишете генератор, почему бы не использовать два выхода, чтобы сэкономить, выполняя дополнительную случайность?

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

.....

2 голосов
/ 01 августа 2017

Простой способ печати рядов Фибоначчи до числа 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 :  "))
2 голосов
/ 04 октября 2015

Чтобы получить числа Фибоначчи до любого числа (в нашем случае 100) с генератором, вы можете сделать это.

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)
2 голосов
/ 11 сентября 2015
def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn
2 голосов
/ 29 июня 2012

У вас была правильная идея и очень элегантное решение, все, что вам нужно сделать, это поменять местами оператор a и b Ваше заявление о доходности должно идти после вашего свопа

a, b = b, a + b #### должно быть a,b = a+b,a #####

`###yield a`
2 голосов
/ 17 октября 2010

Также вы можете попробовать решение в закрытой форме (нет гарантий для очень больших значений n из-за ошибок округления / переполнения):

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

def fib(n):
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5)
2 голосов
/ 17 октября 2010

Также вы можете использовать перечисляемый бесконечный генератор:

for i,f  in enumerate(fib()):
    print i, f
    if i>=n: break
2 голосов
/ 17 октября 2010

Python - это динамически типизированный язык.тип переменной определяется во время выполнения и может изменяться во время выполнения.Вначале вы объявили a для хранения целочисленного типа, а затем присвоили ему функцию, и теперь ее тип стал функцией.

вы пытаетесь применить ' a 'в качестве аргумента функции range () , которая ожидает int arg, но вы фактически предоставили переменную функции в качестве аргумента.

исправленный код должен быть

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

это будет работать

...