【问题标题】:How to write Fibonacci with generator without stop number如何用没有停止号的生成器编写斐波那契
【发布时间】:2019-08-19 03:33:09
【问题描述】:

我通过Beginning Python fibonacci generator

如何在我们想要停止的地方写出停止编号。

我的 FIbnocci 代码如下

def Fibonnaci(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return (Fibonnaci(n-1)+ Fibonnaci(n-2))

n = int(input())
print(Fibonnaci(n))

我写了 yield 语句,但它在无限循环运行

def fib(n):
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib(7)

想要的> 13

【问题讨论】:

  • 只需给fib(n)添加一个计数器

标签: python fibonacci


【解决方案1】:

你不想无限循环;您需要跟踪您执行了多少次操作。

在生成元素时保持循环中计数器的状态。一直到count >= n

def fib(n):
     count = 0
     a, b = 0, 1
     while count < n:
             yield a
             a, b = b, a + b
             count += 1

然后,如果您愿意,您可以在列表推导中利用它来获取所有值,直到该斐波那契数。

[i for i in fib(10)]

【讨论】:

  • 您也可以使用for _ in range(n): 摆脱count var。来自调用者的list(fib(10)) 是列表组合的替代方案。
  • @ggorlen:这更多是为了说明需要保持的状态。我确信这可以以不同的方式完成,但我认为您描述它的方式不会使其更具可读性。
【解决方案2】:

yield 语句用于迭代一些数据,一次产生一个值。

所以:迭代

f = fib()
fibs = [next(f) for _ in range(7)]
fib_7 = fibs[-1]

注意当您以 yield a 开头时,您会得到一个 0 作为第一个数字。所以转移到yield b,它将按预期工作

【讨论】:

    【解决方案3】:
    n = int(input())
    def fibonacci():
        a, b = 0, 1
        while True:
            yield a
            a, b = b, a + b  #swap the values, sum
    
    def firstn(g, n):
        for i in range(n):
            yield g.__next__() # take  the next value for the generator
    
    
    t =  (list(firstn(fibonacci(), n+1))) # Put in a list
    print (t[-1])   #take the last element
    

    【讨论】:

    • 想解释一下这一切吗?
    猜你喜欢
    • 2015-03-26
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2011-12-18
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多