您希望有能力射中自己的脚。
好吧,给你。
在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
我想不出一个单一的场景,你会想要创建一个具有收益率的递归解决方案,而且设置的缺点似乎是巨大的。然而,有些东西只是为了好玩而探索。这个问题让我好奇地做一些研究。 但我会建议,永远不要这样做。