我知道标准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以上,并且我知道如何将上述代码转换为简单的迭代,或者只是使用Gauss公式来计算总和,这些都不是我想要的寻找,上面的代码纯粹是一个示例。
编辑:就像我在上面的“注释”部分中已经说过的(我猜没有人真正读过)一样,我知道如何增加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
答案 0 :(得分:1)
摸索之后,我根据十多年前的官方示例代码获得了以下代码
所以我修改了递归附加代码,使其看起来像这样
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,该tasklet调用函数本身(或类似的东西)。
现在,我想知道这是否确实是在无堆栈Python中实现无限递归的假定方法,还是有其他更直接/直接的方法呢?谢谢。