如何在python中生成斐波那契写法

问题描述 投票:0回答:3
def fib(a, b, f):

fib必须生成(使用收益)广义的斐波那契顺序,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
python generator fibonacci yield function
3个回答
2
投票

该消息表示生成器不支持索引,因此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 s一个值。

def fib(a, b, f):
    x = a
    y = b
    while True:
        yield x
        x, y = y, f(x,y)

0
投票

您无法索引来自fib()之类的生成器函数的结果。下面的示例通过将zip()range()参数一起使用来避免这种情况。 zip()到达其自变量之一时自动停止,然后结束。

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]

0
投票

您将遇到的斐波那契最简单的方法

a,b = 0,1

n为范围(100):打印(a)a = a + b打印(b)b = b + a

© www.soinside.com 2019 - 2024. All rights reserved.