Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带收益率的递归斐波那契_Python_Python 3.x_Recursion_Fibonacci_Yield - Fatal编程技术网

Python 带收益率的递归斐波那契

Python 带收益率的递归斐波那契,python,python-3.x,recursion,fibonacci,yield,Python,Python 3.x,Recursion,Fibonacci,Yield,我正在尝试构建一个Fibonacci函数,在这段代码中,我的 问题是 如何在递归和递归调用中使用yield 我得到这个错误 “不支持+:'generator'和'generator'的操作数类型” 我需要知道如何在递归中使用yield,而不出现这种错误你想让它给你自己一枪 好吧,给你。 在python 3.3+中引入“yield from” “正向递归收益率” (这将与您期望的生成器的行为类似。) 请注意,一旦达到最大递归深度,这将出错 然而,这并不能真正满足我们通常认为的向下工作的递归函数。然

我正在尝试构建一个Fibonacci函数,在这段代码中,我的 问题是

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

我得到这个错误

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


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

你想让它给你自己一枪

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

“正向递归收益率” (这将与您期望的生成器的行为类似。)

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

然而,这并不能真正满足我们通常认为的向下工作的递归函数。然而,我们似乎可以将递归函数简化为尾部递归函数,我们可以引入收益率并加以利用

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

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

i = fib(8)
next(i) #21
next(i) #21
next(i) #RecursionError: maximum recursion depth exceeded in comparison
对于最终版本,我们可以通过引入一个return使函数稍微安全一些

尝试3:#对于非基本情况是安全的

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

我想不出有哪一种场景需要创建一个具有收益率的递归解决方案,而这种设置的缺点似乎是巨大的。然而,有些事情只是为了好玩而去探索。这个问题让我很好奇,于是我对它做了一些研究但是我会建议,千万不要这样做。

这里详细解释的可能重复我的问题不是关于斐波那契的,而是关于递归调用使用收益率,递归链接答案有多个解决方案,包括一个与yieldi有关的解决方案。我找到了答案,但主题与我们无关。这是关于递归的。谢谢你的回答,我想知道如何使用yieldi递归我是新使用它的,是的,我是为了学习更多和乐趣而尝试的,我发现你的尝试更容易理解这个想法,所以再次感谢你
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
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