如何在 Stackless Python 中进行无限(或真正深)递归?

hel*_*ach 5 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))
Run Code Online (Sandbox Code Playgroud)

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

知道如何在 Stackless Python 中进行无限递归吗?谢谢。

注意:我知道如何将标准 CPython 的递归深度限制增加到 1000 以上,并且我知道如何将上面的代码转换为简单的迭代,或者简单地使用高斯公式计算总和,这些不是我要找的,而上面的代码纯粹是作为例子。

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

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

Stackless Python 的缺点是什么?

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

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

hel*_*ach 2

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

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))
Run Code Online (Sandbox Code Playgroud)

它适用于像 1,000,000 这样的大数字,我猜这是一种间接递归,因为该函数调用另一个函数,该函数启动一个调用该函数本身的微线程(或类似的东西)。

现在我想知道这是否确实是在 Stackless Python 中实现无限递归的假定方法,或者是否有更直接/直接的方法来实现它?谢谢。