Подтвердить что ты не робот

Генератор Python Fibonacci

Мне нужно сделать программу, которая запрашивает количество фибоначчи, напечатанных, а затем печатает их как 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(),
4b9b3361

Ответ 1

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

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

против.

a = fib()       

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

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

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

Ответ 2

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

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

Ответ 3

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

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

.....

Ответ 4

Ваш a - это глобальное имя, которое можно сказать.

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

Всякий раз, когда Python видит a, он думает, что вы говорите об этом. Призывать его к чему-то другому (в другом месте или здесь) должны помочь.

Ответ 5

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

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

исправленный код shoud be

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

`###yield a`

Ответ 9

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

Ответ 10

Простой способ печати серии Фибоначчи до 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 :  "))

Ответ 11

Я создал это недавно:

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

Нет, что fab будет расти со временем, поэтому это не идеальное решение.

Ответ 12

Вот как это сделать с помощью n = 50. Вы можете, конечно, заменить 50 на вход пользователя

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

Ответ 13

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

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)

Ответ 14

Похоже, вы используете a дважды. Попробуйте изменить это на другое имя переменной.

Кажется, что для меня отлично работает.

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

Ответ 15

Мне нравится эта версия:

array = [0,1]

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