5

我知道标准 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 以上,并且我知道如何将上述代码转换为简单的迭代,或者简单地使用高斯公式计算总和,这些都不是我要找的,以上代码仅作为示例。

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

4

1 回答 1

2

在摸索之后,我得到了以下基于十多年前官方示例代码的代码here

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。

现在我想知道这是否确实是在 Stackless Python 中实现无限递归的假定方式,还是有更直接/直接的方式来做到这一点?谢谢。

于 2019-03-24T06:56:22.077 回答