Генератор 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(),
Ответы
Ответ 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