繁体   English   中英

在Python中合并排序-RuntimeError:超过了最大递归深度

[英]Merge Sort in Python - RuntimeError: maximum recursion depth exceeded

我正在使用Python进行合并排序。

我已经检查了merge功能。 数组合并很好。

但是在mergeSort函数中出现错误:---

RuntimeError:超过最大递归深度。

()中的RuntimeError Traceback(最近一次调用最后一次)在()63 print(arr [i]),64 ---> 65 mergeSort(arr,0,n-1)66 print(“”)67 print(“ Sorted Array is” )

在mergeSort(arr,l,r)中53 m = l +(r-1)/ 2 54 mergeSort(arr,l,m)-> 55 mergeSort(arr,m + 1,r)56 merge(arr,l ,m,r)57

这可能是什么原因?

def merge(arr,l,m,r):
    n1 = m-l+1
    n2 = r-m

    L = [0] * n1
    R = [0] * n2

    print("First List")
    for i in range(0,n1):
        L[i] = arr[i+l]
        print(L[i]), 


    print("")
    print("Second List")    
    for j in range(0,n2):
        R[j] = arr[j+m+1]
        print(R[j]),



    #Merging the temp arrays
    i = 0
    j = 0
    k = 0
    print("")
    print("Merged List ---------->")

    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            print(arr[k]),
            i+=1
        else:
            arr[k] = R[j]
            print(arr[k]),
            j+=1
        k+=1

    while i<n1:
        arr[k] = L[i]
        i+=1
        k+=1

    while j<n2:
        arr[k] = R[j]
        print(arr[k])
        j+=1
        k+=1

def mergeSort(arr,l,r):
    if l<r:
        m = l+(r-1)/2
        mergeSort(arr,l,m)
        mergeSort(arr,m+1,r)
        merge(arr,l,m,r)


arr = [0,12,13,0,1,22]
n = len(arr)

mergeSort(arr,0,n-1)
print(" ")
print("Sorted Array is")
for i in range(0,n-1):
    print(arr[i])

mergeSort计算m的方法是错误的(您需要将整个表达式除以一半,而不仅是(r-1) )。 更改为:

m = (l+(r-1))/2

当您计算错误时,您的方法会一次又一次地递归调用自身,直到超出最大方法堆栈深度并因此崩溃。

  • 您犯了一个基本错误.Python是动态类型语言
  • 在继续说明为什么出现Run Time RecurssionError之前,您需要进行一次更改。
    代替m = l+(r-1)/2m = (l+r)/2
    因为当您在那时调用mergeSort(arr,0,n-1)时, n-1是最后一个索引值,因此在m = l+(r-1)/2不需要r-1

楼层划分运算符(//)VS普通划分运算符(/)

现在说到要点,为什么会出现RecurssionError就是答案

  • 当你做像

m =(l + r)/ 2

除法运算将得到小数部分,即m将被视为浮动变量
所以m永远不会为0 ,它将是任何浮点数,例如0.1232.1221.0025

由于浮点数,因为m永远不会为0,所以如果条件if l<r:始终为true,并且mergeSort()函数进入无限循环 ,这就是为什么您得到RunTime RecurssionERROR

您希望将m作为整数而不是浮点数 ,而不是m =(l + r)/ 2

写入m =(l + r)// 2 地板除法运算符(//)将为您提供整数值,并且您的mergeSort()函数将不会进入无限循环

这次您的代码将被执行而没有任何错误,只需进行一次更改即可m =(l + r)// 2

但是但是您的merge()函数算法仍然不好,它没有给出排序的数组,数据也丢失了,其他东西被打印了

这是因为在调用mergesort函数时,传递的是l = 0和r = list的长度。 而且无论在每种情况下计算结果如何,您的l都会小于r。

 m = l+(r-1)/2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM