繁体   English   中英

具有收益率的递归斐波那契

[英]Recursive Fibonacci with 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 与递归一起使用

你希望有能力在脚下射击自己。

好吧,给你。 PEP 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM