在python中绕过递归限制

在python中绕过递归限制,python,multithreading,recursion,backtracking,Python,Multithreading,Recursion,Backtracking,我遇到了一个大问题,需要数千层递归,但python不允许。由于我是在windows系统上构建的,因此很难尝试并找到解决方案。本质上,递归在堆栈上运行,在非基于UNIX的系统中,很难搞乱堆栈 如果您正在寻找在UNIX上工作的最简单的解决方案: import sys sys.setrecursionlimit(20000) 但是,正如我提到的,这在windows上对我不起作用。我需要想出解决方案或切换操作系统 为了解决这个问题,我有一个疯狂的想法,就是使用多线程来给我提供多个堆栈。在我尝试之前,我

我遇到了一个大问题,需要数千层递归,但python不允许。由于我是在windows系统上构建的,因此很难尝试并找到解决方案。本质上,递归在堆栈上运行,在非基于UNIX的系统中,很难搞乱堆栈

如果您正在寻找在UNIX上工作的最简单的解决方案:

import sys
sys.setrecursionlimit(20000)

但是,正如我提到的,这在windows上对我不起作用。我需要想出解决方案或切换操作系统

为了解决这个问题,我有一个疯狂的想法,就是使用多线程来给我提供多个堆栈。在我尝试之前,我真的不知道这是否有效。我通常讨厌多线程,但这是一个非常基本的版本。我相信其他人可以改进它。在我的最终产品中,我在回溯算法中实现了多线程

import threading


def recurThread(x,y,z):
    if x <= 1:
        y.append(x)
        if z[0] != 1:
            new_y = []
            z[0] -= 1
            new_t = threading.Thread(target=recurThread, args=(900, new_y, z))
            new_t.start()
            new_t.join()

            y += new_y
        else:
            return

    y.append(x)
    return recurThread(x-1, y, z)


y = []
z = [50]
x = threading.Thread(target=recurThread, args=(900, y, z))
x.start()
x.join()
total = 0
print(len(y))
for i in y:
    total += i

print(total)
这是基本思想。需要注意的是,如果希望从线程中获取值,则需要存储它们并将其作为列表等可变对象传递


如果你不熟悉像我一样的线程,你需要注意的另一件事是,启动你的线程。更重要的是,.join将等待线程完成后再继续。这使得程序可以正常运行,只需使用线程的这个实例,就可以欺骗堆栈限制

IMO使用额外线程作为获得额外堆栈空间的方法是。。。有点奇怪。毫无疑问,您可以让它工作,但每次您向其他程序员展示它时,您都必须再次解释它。可能更好的解决方案是重新编写算法,使用显式操作数堆栈,而不是使用递归。它更具可扩展性,每个人都会理解你做了什么,以及你为什么这么做。尽管它可能很奇怪,但它工作得完美无缺。对于任何寻求不同解决方案的人来说,这只是一种选择。另外,使用显式操作数堆栈,我保证您仍然需要解释原因。正如我提到的,这被集成到回溯算法中。这种方法对我来说比试图重写要简单得多。每个递归代码都可以用显式堆栈作为迭代重写。看这里,虽然鼓励自我回答,但仍然需要将原始问题视为其他问题来提出。这是毫无疑问的。顺便说一句,正如其他人所提到的那样,提供的答案很可能是解决问题的糟糕办法。请参阅meta。如何将回溯算法重写为显式堆栈?我创建的解决方案似乎比管理转换容易得多。@ggorlen我认为很清楚的问题是如何在windows系统上绕过python中的递归限制。我找到了一种方法来做我在别处没有看到的事情,所以我觉得值得分享。从一个简单的回溯算法转换到它似乎比转换到显式堆栈更简单、更快。这很好,但对于初学者来说,线程有大量的开销。每次调用启动一个新线程的成本非常高。至于这个问题,它从来没有说如何在windows机器上绕过Python中的递归限制?或者还有其他问题要说。最后,sys.setrecursionlimit2000在windows上运行良好。