首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python合并排序实现错误:超过最大递归深度

问python合并排序实现错误:超过最大递归深度
EN

Stack Overflow用户
提问于 2021-11-10 08:34:18
回答 2查看 43关注 0票数 0

下面是我尝试用python实现的一个简单的合并排序算法。我试图在不使用在别处找到的left和right参数的情况下这样做,只使用切片。

代码语言:javascript
复制
from math import floor


def merge(A, B):
    """Mearges the two sorted lists A and B"""
    merged = []
    i, j = 0, 0
    while i < len(A) and j < len(B):
        if A[i] <= B[j]:
            merged.append(A[i])
            i += 1
        else:
            merged.append(B[j])
            j += 1
    
    if j == len(B):
        merged.extend(A[i:])
    elif i == len(A):
        merged.extend(B[j:])
    
    return merged

def merge_sort(A):
    if len(A) == 1:
        return A
    
    m = floor(len(A) / 2)
    half1 = A[0:m]    
    half2 = A[m:]
    A = merge_sort(half1)
    B = merge_sort(half2)
    R = merge(A, B)
    return R



def main():
    C = [6, 7, 2]
    print(merge_sort(C))
    exit()

if __name__ == "__main__":
    main()

它运行得很好。但当我试着

代码语言:javascript
复制
A = merge_sort(A[0:m])
B = merge_sort(A[m:])

我没有在merge_sort函数中使用变量half1和half2,而是这样:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/home/aayush/PyProgs/mrg_sort.py", line 44, in <module>
    main()
  File "/home/aayush/PyProgs/mrg_sort.py", line 40, in main
    print(merge_sort(C))
  File "/home/aayush/PyProgs/mrg_sort.py", line 32, in merge_sort
    B = merge_sort(A[m:])
  File "/home/aayush/PyProgs/mrg_sort.py", line 31, in merge_sort
    A = merge_sort(A[0:m])
  File "/home/aayush/PyProgs/mrg_sort.py", line 31, in merge_sort
    A = merge_sort(A[0:m])
  File "/home/aayush/PyProgs/mrg_sort.py", line 31, in merge_sort
    A = merge_sort(A[0:m])
  [Previous line repeated 993 more times]
  File "/home/aayush/PyProgs/mrg_sort.py", line 25, in merge_sort
    if len(A) == 1:
RecursionError: maximum recursion depth exceeded while calling a Python object

请告诉我我做错了什么。

EN

回答 2

Stack Overflow用户

发布于 2021-11-10 08:54:31

您只需检查变量命名,因为此处A已更新,并且您使用的是该列表数据,而不是原始列表数据

代码语言:javascript
复制
def merge_sort(A):
    if len(A) == 1:
        return A
    
    m = floor(len(A) / 2)
    c = merge_sort(A[0:m])
    B = merge_sort(A[m:])
    R = merge(c, B)
    return R
票数 1
EN

Stack Overflow用户

发布于 2021-11-10 08:54:30

你有没有尝试过更小的数据?

尝试:

导入sys sys.setrecursionlimit(10000)

如果算法没有结束,则重试,您将有一个无限循环

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69910002

复制
相关文章

相似问题

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