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

时间:2018-07-05 12:19:52

标签: python algorithm sorting data-structures mergesort

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

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

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

  

RuntimeError:超过最大递归深度。

     

RuntimeError跟踪(最近的调用)   最后)在()        63打印(arr [i]),        64   ---> 65 mergeSort(arr,0,n-1)        66打印(“”)        67 print(“排序数组为”)

     在mergeSort(arr,l,r)中的

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

这可能是什么原因?

mergeSort

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

  • 您犯了一个基本错误。Python是动态类型语言
  • 在解释为什么出现Run Time RecurssionError之前,您需要进行一次更改。
    代替m = l+(r-1)/2m = (l+r)/2
    因为那时您调用mergeSort(arr,0,n-1)的时候n-1是最后一个索引值,所以这就是r-1中不需要m = l+(r-1)/2的原因

地板师(//)VS普通师(/)

现在到了要点,为什么会出现 RecurssionError 这是答案

  • 进行类似操作时
  

m =(l + r)/ 2

除法运算将给出分数部分,即m将被视为浮动变量
因此m永远不会是 0 ,它是任何浮点数,例如 0.123 2.122 1.0025

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

的原因
  

您希望 m 整数 ,而不是 float =(l + r)/ 2

     

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

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

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

答案 2 :(得分:-1)

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

 m = l+(r-1)/2