[英]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.