首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将python中的递归深度增加到100000

将python中的递归深度增加到100000
EN

Stack Overflow用户
提问于 2017-07-14 14:42:33
回答 1查看 2.5K关注 0票数 1

python有一个默认的最大递归深度,我可以增加这个深度:

代码语言:javascript
复制
import sys

sys.setrecursionlimit(100000)

我正在使用合并排序,当我在一个包含80000个元素的列表上尝试它时,python“意外退出”。这不是我迭代实现合并排序的问题,但我对递归排序很感兴趣。

我使用的是Mac 8 8GB内存。有没有办法让它在我的机器上工作,或者它能在更好的机器上工作?

代码语言:javascript
复制
import sys

sys.setrecursionlimit(100000) # python has a recurison depth of < 1000~. so for the purpose of this assignment I'm increasing it

counter = 0


def merge_sort(lst):
    global counter
    if len(lst) <= 1:
        counter += 1   # increment counter when we divide array in two
        return lst
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    return merge(left, right)


def merge(left, right):
    global counter
    if not left:
        counter += 1   # increment counter when not left (not left - is also comparison)
        return right
    if not right:
        counter += 1   # the same as above for right
        return left
    if left[0] < right[0]:
        counter += 1   # and the final one increment
        return [left[0]] + merge(left[1:], right)
    return [right[0]] + merge(left, right[1:])


lines = [line.rstrip('\n') for line in open('words.txt')]

当我在40000上尝试上面的方法时,它可以工作,并对列表进行排序:

代码语言:javascript
复制
print(merge_sort(lines[0:40000]))

但在50000或更高版本上则不是这样,.txt文件中的总字数约为80000

我得到的信息是:

代码语言:javascript
复制
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 15:23:29

问题来自于您的merge(left, right)实现,它在O(n)中是递归的。在每个递归步骤中,通过一个元素合并两个已排序的列表。在优化了尾递归的语言中,合并是递归的想法可能是有意义的,but it is not the case in python

一般来说,merge是迭代的,因为它的复杂度始终至少是要合并的元素的数量。

代码语言:javascript
复制
def merge(left, right):
    merged = []
    i = 0
    j = 0
    while i < len(left) and j < len(right) :
        if left[i] < right[j]:
            merged.append(left[i])
            i+=1
        else:
            merged.append(right[j])
            j+=1
    merged += left[i:]
    merged += right[j:]
    return merged
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45096347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档