我知道标准的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支持无限递归:
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
发布于 2019-03-24 14:56:22
经过摸索,我得到了以下代码,该代码基于十多年前的一个官方示例代码
所以我修改了递归加法代码,如下所示
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中实现无限递归的假设方法,或者是否有更直接/直接的方法来实现它?谢谢。
https://stackoverflow.com/questions/55321142
复制相似问题