gpt4 book ai didi

python - 如何在 Stackless Python 中进行无限(或非常深)递归?

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:57 25 4
gpt4 key购买 nike

我知道标准 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

最佳答案

经过摸索,我根据十多年前的官方示例代码得到了以下代码

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,该 tasklet 调用该函数本身(或类似的东西)。

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

关于python - 如何在 Stackless Python 中进行无限(或非常深)递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55321142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com