如何在Stackless Python中进行无限(或非常深)的递归?

时间:2019-03-24 06:01:39

标签: python recursion python-stackless

我知道标准CPython的递归深度有一个限制,我认为小于1000,因此下面的示例代码将因“超过最大递归深度”错误而失败。

def rec_add(x):
    if x == 0:
        return x
    else:
        return x + add(x - 1)

print(rec_add(1000))

我听说Stackless Python支持无限递归深度,但是如果我使用Stackless Python运行以上代码,它仍然报告“超出最大递归深度”错误。我认为也许我需要以某种方式修改代码,以使其能够使用Stackless Python的无限递归深度功能?

有什么想法如何在Stackless Python中进行无限递归吗?谢谢。

注意:我知道如何将标准CPython的递归深度限制增加到1000以上,并且我知道如何将上述代码转换为简单的迭代,或者只是使用Gauss公式来计算总和,这些都不是我想要的寻找,上面的代码纯粹是一个示例。

编辑:就像我在上面的“注释”部分中已经说过的(我猜没有人真正读过)一样,我知道如何增加CPython的递归限制,并且我知道如何将示例代码转换为迭代或只是高斯转换n *(n + 1)/ 2的求和公式,我在这里只是问一下,因为我听说Stackless Python的一大特色是它可以实现无限递归,而且我不知道如何为示例代码。

EDIT2:我不确定是否有“ Stackless Python支持无限递归”的想法,但是这里有一些消息源(或暗示)Stackless Python支持无限递归:

What are the drawbacks of Stackless Python?

https://bitbucket.org/stackless-dev/stackless/issues/96

https://stackless.readthedocs.io/en/3.6-slp/whatsnew/stackless.html

1 个答案:

答案 0 :(得分:1)

摸索之后,我根据十多年前的官方示例代码获得了以下代码

https://bitbucket.org/stackless-dev/stacklessexamples/src/a01959c240e2aeae068e56b86b4c2a84a8d854e0/examples/?at=default

所以我修改了递归附加代码,使其看起来像这样

import stackless


def call_wrapper(f, args, kwargs, result_ch):
    result_ch.send(f(*args, **kwargs))


def call(f, *args, **kwargs):
    result_ch = stackless.channel()
    stackless.tasklet(call_wrapper)(f, args, kwargs, result_ch)
    return result_ch.receive()


def rec_add(n):
    if n <= 1:
        return 1
    return n + call(rec_add, n-1)


print(rec_add(1000000))

它可以像1,000,000那样大量使用,我想这是一种间接递归,因为该函数调用另一个函数,该函数启动一个tasklet,该tasklet调用函数本身(或类似的东西)。

现在,我想知道这是否确实是在无堆栈Python中实现无限递归的假定方法,还是有其他更直接/直接的方法呢?谢谢。