我需要制作一个程序,询问打印的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(),
答案 0 :(得分:26)
我会使用这种方法:
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 :(得分:23)
你给a
含义太多了:
a = int(raw_input('Give amount: '))
VS
a = fib()
如果您为变量提供更具描述性的名称(在10行代码中对名称a
进行3次不同使用),您将不会遇到问题(经常)!:
amount = int(raw_input('Give amount: '))
并将range(a)
更改为range(amount)
。
答案 2 :(得分:13)
既然你正在编写一个生成器,为什么不使用两个收益,以节省额外的洗牌?
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
.....
答案 3 :(得分:4)
使用生成器非常简单:
def fin(n):
a, b = 0, 1
for i in range(n):
yield a
a, b = b, a + b
ln = int(input('How long? '))
print(list(fin(ln))) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...]
答案 4 :(得分:2)
您的a
是一个全球名称。
a = int(raw_input('Give amount: '))
每当Python看到a
时,它就会认为你在谈论上面的那个。把它叫做别的东西(别处或这里)应该会有所帮助。
答案 5 :(得分:2)
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 : "))
答案 6 :(得分:2)
要使用生成器获取斐波那契数字直到任意数字(在本例中为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)
答案 7 :(得分:2)
def fibonacci(n):
fn = [0, 1,]
for i in range(2, n):
fn.append(fn[i-1] + fn[i-2])
return fn
答案 8 :(得分:2)
你有正确的想法和非常优雅的解决方案,你需要做的就是你交换和添加a和b的声明。您的收益率陈述也应该在您的掉期之后
a, b = b, a + b ####
应为a,b = a+b,a #####
`###yield a`
答案 9 :(得分:2)
此外,您可以尝试封闭形式的解决方案(由于舍入/溢出错误,无法保证非常大的n值):
root5 = pow(5, 0.5) ratio = (1 + root5)/2 def fib(n): return int((pow(ratio, n) - pow(1 - ratio, n))/root5)
答案 10 :(得分:2)
您也可以使用枚举无限生成器:
for i,f in enumerate(fib()):
print i, f
if i>=n: break
答案 11 :(得分:2)
Python是一种动态类型语言。变量的类型在运行时确定,并且可以在执行过程中变化。 首先,您声明了一个包含整数类型的函数,之后您为其分配了一个函数,因此它的类型现在变成了一个函数。
你试图将' 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(),
这将起作用
答案 12 :(得分:1)
我刚刚建立了这个:
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
会随着时间的推移而增长,因此它不是一个完美的解决方案。
答案 13 :(得分:1)
看起来您正在使用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())
答案 14 :(得分:1)
我喜欢这个版本:
array = [0,1]
for i in range(20):
x = array[0]+array[1]
print(x)
array[0] = array[1]
array[1] = x
答案 15 :(得分:1)
def genFibanocciSeries():
a=0
b=1
for x in range(1,10):
yield a
a,b = b, a+b
for fib_series in genFibanocciSeries():
print(fib_series)
答案 16 :(得分:0)
以下是产生斐波那契的两种解决方案:
def fib_generator(num):
'''
this will works as generator function and take yield into account.
'''
assert num > 0
a, b = 1, 1
while num > 0:
yield a
a, b = b, a+b
num -= 1
times = int(input('Enter the number for fib generaton: '))
fib_gen = fib_generator(times)
while(times > 0):
print(next(fib_gen))
times = times - 1
def fib_series(num):
'''
it collects entires series and then print it.
'''
assert num > 0
series = []
a, b = 1, 1
while num > 0:
series.append(a)
a, b = b, a+b
num -= 1
print(series)
times = int(input('Enter the number for fib generaton: '))
fib_series(times)
答案 17 :(得分:0)
print( .. )
答案 18 :(得分:-1)
我们可以在不通过'yield 和'next' 语句的情况下快速使用它
def fib(n):
return n if n <= 1 else fib(n - 1) + fib(n - 2)