【问题标题】:how to write generate Fibonacci in python如何在python中编写生成斐波那契
【发布时间】:2015-03-26 16:46:30
【问题描述】:
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

【问题讨论】:

  • yield 返回生成器而不是迭代器。
  • take (...) Python 函数吗?更有可能来自 Haskell ;)
  • @Anzel 这是 OP 自己定义的函数。
  • @augurar,我知道,我只是有点讽刺;)

标签: python generator fibonacci yield function


【解决方案1】:

你会遇到的最简单的斐波那契方法:

a , b =0 , 1

for n in range(100):#any number 
    print(a)
    a = a + b
    print (b)
    b = b + a

【讨论】:

    【解决方案2】:

    您不能索引来自像 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]
    

    【讨论】:

      【解决方案3】:

      该消息表示生成器不支持索引,因此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() 函数也不起作用。你不应该在函数结束时递归;而是编写一个循环,让yields 每次迭代都有一个值。

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

      【讨论】:

      • 我对 python 比较陌生。你能告诉我如何修改take函数吗?
      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多