首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Stackless Python中进行无限(或真正深度)的递归?

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

Stack Overflow用户
提问于 2019-03-24 14:01:39
回答 1查看 179关注 0票数 5

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

代码语言:javascript
复制
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以上,并且我知道如何将上面的代码转换为简单的迭代,或者只是使用高斯公式来计算总和,这些都不是我想要的,上面的代码纯粹是一个示例。

编辑:就像我在上面的“注意”部分说过的(我猜实际上没有人读过),我知道如何增加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

EN

回答 1

Stack Overflow用户

发布于 2019-03-24 14:56:22

经过摸索,我得到了以下代码,该代码基于十多年前的一个官方示例代码

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

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

代码语言:javascript
复制
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这样的大数字,我猜这是一种间接递归,因为该函数调用另一个函数,该函数启动一个微线程来调用函数本身(或者类似这样的东西)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55321142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档