如何在无堆栈Python中执行无限(或真正深层)递归?

如何在无堆栈Python中执行无限(或真正深层)递归?,python,recursion,python-stackless,Python,Recursion,Python Stackless,我知道标准CPython对递归深度有一个限制,我认为小于1000,因此下面的示例代码将失败,并出现“超过最大递归深度”错误 我听说Stackless Python支持无限递归深度,但如果我使用Stackless Python运行上述代码,它仍然会报告“超过最大递归深度”错误。我想也许我需要以某种方式修改代码,使其能够使用Stackless Python的无限递归深度特性 知道如何在无堆栈Python中执行无限递归吗?谢谢 注意:我知道如何将标准CPython的递归深度限制提高到1000以上,我知

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

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

知道如何在无堆栈Python中执行无限递归吗?谢谢

注意:我知道如何将标准CPython的递归深度限制提高到1000以上,我知道如何将上面的代码转换为简单的迭代,或者简单地使用高斯公式来计算和,这些不是我想要的,上面的代码纯粹是作为一个示例

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

EDIT2:我不确定我是否理解错了“Stackless Python支持无限递归”,但这里有一些资料说(或暗示)Stackless Python支持无限递归:


在摸索之后,我根据十多年前这里的一个官方示例代码得到了以下代码

所以我修改了递归加法代码如下

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))
导入无堆栈
def call_wrapper(f、args、kwargs、result_ch):
结果发送(f(*args,**kwargs))
def呼叫(f、*args、**kwargs):
结果\u ch=stackless.channel()
taskless.tasklet(调用包装器)(f、args、kwargs、result\u ch)
返回结果_ch.receive()
def记录添加(n):

如果n个可能的重复肯定不是重复,因为我明确询问了如何在Stackless Python中实现无限递归,而不是如何在标准CPython中将递归深度限制增加到1000以上,这就是你的相关问题及其公认的答案。我认为你是在一个基本的误解下运作的。。。我在stackless文档中没有看到与无限递归相关的内容。。。它似乎更多地与async/await类型的东西(现在内置于python中)有关。没有无限递归。我从过去的一个问题中看到,Stackless支持无限递归:,还有一些在线文档谈到无限递归以及如何限制内存使用:
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))