Python 斐波那契生成器
- 2025-04-10 09:45:00
- admin 原创
- 22
问题描述:
我需要编写一个程序,要求打印斐波那契数的数量,然后打印它们,如 0、1、1、2……但我无法让它工作。我的代码如下所示:
a = int(raw_input('Give amount: '))
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
a = fib()
a.next()
0
for i in range(a):
print a.next(),
;
解决方案 1:
我会用这种方法:
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)))
解决方案 2:
你给出了a
太多含义:
a = int(raw_input('Give amount: '))
对阵
a = fib()
a
如果你给变量赋予更具描述性的名称( 10 行代码中3 种不同的名称用法!),则不会(经常)遇到问题:
amount = int(raw_input('Give amount: '))
并更改range(a)
为range(amount)
。
解决方案 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:
使用生成器真的很简单:
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, ...]
解决方案 5:
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(),
这会起作用
解决方案 6:
def fibonacci(n):
fn = [0, 1,]
for i in range(2, n):
fn.append(fn[i-1] + fn[i-2])
return fn
解决方案 7:
要使用生成器获取任意数字(在本例中为 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)
解决方案 8:
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)
解决方案 9:
a
可以这么说,您的名字是全球性的。
a = int(raw_input('Give amount: '))
每当 Python 看到 时a
,它就认为你正在谈论上面的那个。将其命名为其他名称(其他地方或此处)应该会有所帮助。
解决方案 10:
您还可以使用枚举无限生成器:
for i,f in enumerate(fib()):
print i, f
if i>=n: break
解决方案 11:
您也可以尝试闭式解决方案(由于舍入/溢出错误,无法保证 n 的值非常大):
根5 = pow(5,0.5)
比率 = (1 + 根5)/2
定义 fib(n):
返回 int((pow(ratio, n) - pow(1 - ratio, n))/root5)
解决方案 12:
你的想法很正确,解决方案也非常优雅,你需要做的就是修复 a 和 b 的交换和添加语句。你的收益语句也应该在交换之后
a, b = b, a + b ####
应该是a,b = a+b,a #####
`###yield a`
解决方案 13:
打印斐波那契数列直到 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 : "))
解决方案 14:
a = 3 #raw_input
def fib_gen():
a, b = 0, 1
while 1:
yield a
a, b = b, a + b
fs = fib_gen()
next(fs)
for i in range(a):
print (next(fs))
解决方案 15:
我最近发现了这种类型的构造(非常感谢@KellyBundy),所以我无法抗拒:
n = 20
fib = (a for a,b in [(0,1)] for _ in range(n) for a,b in [(b,a+b)])
print(list(fib))
# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
解决方案 16:
我不久前就建好了它:
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
,随着时间的推移它会增长,所以这不是一个完美的解决方案。
解决方案 17:
看起来您使用了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())
解决方案 18:
我喜欢这个版本:
array = [0,1]
for i in range(20):
x = array[0]+array[1]
print(x)
array[0] = array[1]
array[1] = x
解决方案 19:
以下是斐波那契生成的两种解决方案:
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)
解决方案 20:
你为什么要选择复杂的,这是我要处理的片段之一!!
n = int(input('Enter your number..: '))
a = 0
b = 1
c = 0
print(a)
print(b)
for i in range(3, n+1):
c = a+b
print(c)
a,b=b,c
查看我的 git - rohith-sreedharan
解决方案 21:
编写以下代码:
nterm = int(input("How many Fibonacci numbers do you want to find out? "))
n1 = 0
n2 = 1
fibonacciList = [
n1,
n2
]
if nterm >= 1:
for i in range(nterm):
fibonacciList.insert(
len(fibonacciList),
fibonacciList[-1] + fibonacciList[-2]
)
print(fibonacciList[0:len(fibonacciList) - 2])
else:
print("Invalid value")
len表示长度。
;
解决方案 22:
我们可以简单地使用它,而不需要通过 'yield' 和 'next' 语句
def fib(n):
return n if n <= 1 else fib(n - 1) + fib(n - 2)
扫码咨询,免费领取项目管理大礼包!