【问题标题】:Recursive Fibonacci with yield具有收益率的递归斐波那契
【发布时间】:2019-04-14 10:23:49
【问题描述】:

我正在尝试在此代码中构建一个带有 yield 的斐波那契函数,我的 问题是

如何在递归和递归调用中使用yield

def fib(x):
  if(x==0 or x==1 ):
   yield  1
  else:
    yield fib(x-1)+fib(x-2)

y=[i for i in fib(10)]
print(y);

我收到此错误


"+ 不支持的操作数类型:'generator' 和 'generator'"

我需要知道如何在递归中使用 yield 而不会出现此错误

【问题讨论】:

标签: python python-3.x recursion fibonacci yield


【解决方案1】:

您希望有能力射中自己的脚。

好吧,给你。 在PEP 380PEP 380中引入python 3.3+中的“yield from”

"前向递归收益率" (这将与您期望生成器的行为相似。)

def fib_infinity(start = 0, acc = 1):
    yield start + acc
    yield from fib_infinity(acc, start + acc)

i = fib_infinity()
next(i) #1
next(i) #2
next(i) #3
next(i) #5
next(i) #8

请注意,一旦达到最大递归深度,这将出错。

然而,这并不能真正满足我们对尝试向下工作的通常递归函数的看法。但是,似乎我们可以将递归函数简化为尾递归函数,我们可以引入 yield 并利用它。

尝试 2: “反向递归收益率”

def fib(n, a = 0, b = 1): 
    if n == 0:
        yield a
    if n == 1: 
        yield b
    yield from fib(n - 1, b, a + b)

y = [next(fib(i)) for i in range(10)]
#[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

但是请注意,我们在“下一个”调用中获得输出。现在如果让收益松动会发生什么?

i = fib(8)
next(i) #21
next(i) #21
next(i) #RecursionError: maximum recursion depth exceeded in comparison

对于最终版本,我们可以通过引入返回来使函数更加安全。

尝试 3:#safe 用于非基本情况。

def fib(n, a = 0, b = 1): 
    if n == 0:
        yield a
        return 0
    if n == 1: 
        yield b
        return 0
    yield from fib(n - 1, b, a + b)
i = fib(8)
next(i) #21
next(i) #StopIteration

我想不出一个单一的场景,你会想要创建一个具有收益率的递归解决方案,而且设置的缺点似乎是巨大的。然而,有些东西只是为了好玩而探索。这个问题让我好奇地做一些研究。 但我会建议,永远不要这样做。

【讨论】:

  • 感谢您的回答,我是想知道如何使用 yield 我是新手,是的,我尝试这样做是为了了解更多和乐趣,我发现您的尝试更容易理解这个想法,所以再次感谢你
猜你喜欢
  • 2010-12-03
  • 2014-04-02
  • 2017-11-18
  • 2014-01-08
  • 2011-12-14
  • 2012-11-29
  • 2018-04-10
  • 2016-02-21
相关资源
最近更新 更多