如何在 python 中生成斐波那契数列
how to write generate Fibonacci in python
def fib(a, b, f):
fib 必须生成(使用 yield)广义斐波那契
序列,a和b是第一个和第二个元素。 f 是获取第三个元素的函数,而不是像普通斐波那契数列那样的 a+b。使用 take 函数(如下所示)进行测试。
我的代码如下
def fib(a, b, f):
x = a
y = b
yield x
x, y = y, f(x,y)
fib(x,y,f)
我不知道我的代码有什么问题,当我尝试测试它时,它显示
"TypeError: 'generator' object is not subscriptable"
测试用例是:
take(5, fib(0, 1, lambda x, y: x - y))
它应该输出:
[0, 1, -1, 2, -3]
我写的函数是:
def take(n, iterable):
x = []
if n <= 0:
return x
else:
for i in range (0,n):
x.append(iterable[i])
return x
该消息表示生成器不支持索引,因此 iterable[i]
失败。相反,使用 next()
函数从迭代器中获取下一项。
def take(n, iterable):
x = []
if n > 0
itr = iter(iterable) # Convert the iterable to an iterator
for _ in range(n): # Repeat n times
x.append(next(itr)) # Append the next item from the iterator
return x
此外,您的 fib()
功能将无法使用。你不应该在函数的末尾递归;而是写一个循环,每次迭代 yield
都是一个值。
def fib(a, b, f):
x = a
y = b
while True:
yield x
x, y = y, f(x,y)
您无法索引来自 fib()
等生成器函数的结果。下面通过使用 zip()
和 range()
参数来避免这种情况。 zip()
当其中一个参数到达 then end 时自动停止。
def fib(a, b, f):
x, y = a, b
while True:
yield x
x, y = y, f(x, y)
def take(n, iterable):
return [] if n <= 0 else [v for _, v in zip(range(n), iterable)]
print( take(5, fib(0, 1, lambda x, y: x-y)) )
输出:
[0, 1, -1, 2, -3]
您会遇到的最简单的斐波那契方法:
a , b =0 , 1
for n in range(100):#any number
print(a)
a = a + b
print (b)
b = b + a
def fib(a, b, f):
fib 必须生成(使用 yield)广义斐波那契 序列,a和b是第一个和第二个元素。 f 是获取第三个元素的函数,而不是像普通斐波那契数列那样的 a+b。使用 take 函数(如下所示)进行测试。
我的代码如下
def fib(a, b, f):
x = a
y = b
yield x
x, y = y, f(x,y)
fib(x,y,f)
我不知道我的代码有什么问题,当我尝试测试它时,它显示
"TypeError: 'generator' object is not subscriptable"
测试用例是:
take(5, fib(0, 1, lambda x, y: x - y))
它应该输出:
[0, 1, -1, 2, -3]
我写的函数是:
def take(n, iterable):
x = []
if n <= 0:
return x
else:
for i in range (0,n):
x.append(iterable[i])
return x
该消息表示生成器不支持索引,因此 iterable[i]
失败。相反,使用 next()
函数从迭代器中获取下一项。
def take(n, iterable):
x = []
if n > 0
itr = iter(iterable) # Convert the iterable to an iterator
for _ in range(n): # Repeat n times
x.append(next(itr)) # Append the next item from the iterator
return x
此外,您的 fib()
功能将无法使用。你不应该在函数的末尾递归;而是写一个循环,每次迭代 yield
都是一个值。
def fib(a, b, f):
x = a
y = b
while True:
yield x
x, y = y, f(x,y)
您无法索引来自 fib()
等生成器函数的结果。下面通过使用 zip()
和 range()
参数来避免这种情况。 zip()
当其中一个参数到达 then end 时自动停止。
def fib(a, b, f):
x, y = a, b
while True:
yield x
x, y = y, f(x, y)
def take(n, iterable):
return [] if n <= 0 else [v for _, v in zip(range(n), iterable)]
print( take(5, fib(0, 1, lambda x, y: x-y)) )
输出:
[0, 1, -1, 2, -3]
您会遇到的最简单的斐波那契方法:
a , b =0 , 1
for n in range(100):#any number
print(a)
a = a + b
print (b)
b = b + a