hel*_*ach 5 python recursion python-stackless
我知道标准 CPython 对递归深度有限制,我认为小于 1000,所以下面的示例代码将失败并出现“超出最大递归深度”错误。
def rec_add(x):
if x == 0:
return x
else:
return x + add(x - 1)
print(rec_add(1000))
Run Code Online (Sandbox Code Playgroud)
听说 Stackless Python 支持无限递归深度,但是如果我用 Stackless Python 运行上面的代码,它仍然报告“超出最大递归深度”错误。我想也许我需要以某种方式修改代码以使其能够使用 Stackless Python 的无限递归深度功能?
知道如何在 Stackless Python 中进行无限递归吗?谢谢。
注意:我知道如何将标准 CPython 的递归深度限制增加到 1000 以上,并且我知道如何将上面的代码转换为简单的迭代,或者简单地使用高斯公式计算总和,这些不是我要找的,而上面的代码纯粹是作为例子。
编辑:就像我在上面的“注释”部分已经说过的那样(我猜没有人真正阅读过),我知道如何增加 CPython 的递归限制,并且我知道如何将示例代码转换为迭代或只是一个高斯和公式n * (n + 1) / 2,我只是在这里问,因为我听说 Stackless Python 的一大特色是它支持无限递归,我不知道如何为示例代码启用它。
EDIT2:我不确定我是否理解“Stackless Python 支持无限递归”的想法是错误的,但这里有一些来源说(或暗示)Stackless Python 支持无限递归:
https://bitbucket.org/stackless-dev/stackless/issues/96
https://stackless.readthedocs.io/en/3.6-slp/whatsnew/stackless.html
经过摸索之后,我根据十多年前的官方示例代码得到了以下代码
所以我修改了递归加法代码,如下所示
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))
Run Code Online (Sandbox Code Playgroud)
它适用于像 1,000,000 这样的大数字,我猜这是一种间接递归,因为该函数调用另一个函数,该函数启动一个调用该函数本身的微线程(或类似的东西)。
现在我想知道这是否确实是在 Stackless Python 中实现无限递归的假定方法,或者是否有更直接/直接的方法来实现它?谢谢。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |