Python中的合并排序-运行时错误:超过最大递归深度
我正在Python中进行合并排序 我已经检查了Python中的合并排序-运行时错误:超过最大递归深度,python,algorithm,sorting,data-structures,mergesort,Python,Algorithm,Sorting,Data Structures,Mergesort,我正在Python中进行合并排序 我已经检查了合并功能。阵列正在合并 但是在mergeSort函数中出现错误:--- 运行时错误:超过最大递归深度 运行时错误回溯(最近的调用) 最后)在() 63打印(arr[i]), 64 --->65合并排序(arr,0,n-1) 66字(“”) 67打印(“排序数组为”) 在合并排序中(arr、l、r) 53米=l+(r-1)/2 54合并排序(arr、l、m) --->55合并排序(arr,m+1,r) 56合并(arr、l、m、r) 57 可能的原因是
合并
功能。阵列正在合并
但是在mergeSort
函数中出现错误:---
运行时错误:超过最大递归深度
运行时错误回溯(最近的调用)
最后)在()
63打印(arr[i]),
64
--->65合并排序(arr,0,n-1)
66字(“”)
67打印(“排序数组为”)
在合并排序中(arr、l、r)
53米=l+(r-1)/2
54合并排序(arr、l、m)
--->55合并排序(arr,m+1,r)
56合并(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])
def合并(arr、l、m、r):
n1=m-l+1
n2=r-m
L=[0]*n1
R=[0]*n2
打印(“第一个列表”)
对于范围(0,n1)内的i:
L[i]=arr[i+L]
打印(L[i]),
打印(“”)
打印(“第二份清单”)
对于范围(0,n2)内的j:
R[j]=arr[j+m+1]
印刷品(R[j]),
#合并临时数组
i=0
j=0
k=0
打印(“”)
打印(“合并列表------->”)
当i 如果L[i]是因为调用mergesort函数时,传递的是L=0和r=list的长度。
不管你的计算结果是什么,在任何情况下,你的l都会小于r
m = l+(r-1)/2
这是因为在调用mergesort函数时,传递的是列表的l=0和r=length。
不管你的计算结果是什么,在任何情况下,你的l都会小于r
m = l+(r-1)/2
在mergeSort
中计算m
的方法是错误的(您需要将整个表达式分成一半,而不仅仅是(r-1)
)。将其更改为:
m = (l+(r-1))/2
当您错误地计算时,您的方法一次又一次地递归调用自己,直到超过最大方法堆栈深度,从而崩溃 在mergeSort
中计算m
的方法是错误的(您需要将整个表达式分成一半,而不仅仅是(r-1)
)。将其更改为:
m = (l+(r-1))/2
当您错误地计算时,您的方法一次又一次地递归调用自己,直到超过最大方法堆栈深度,从而崩溃
- 你犯了一个基本的错误。Python是动态类型语言
- 在讨论为什么会出现运行时递归错误之前,您需要做一个更改。
而不是m=l+(r-1)/2
writem=(l+r)/2
因为当您调用mergeSort(arr,0,n-1)
时,n-1
是最后一个索引值,这就是为什么m=l+(r-1)/2中不需要r-1
楼层分区操作员(//)与普通分区操作员(/)
现在来谈谈你为什么会得到递归错误的要点,答案如下
- 当你像这样做手术的时候
m=(l+r)/2
除法运算将给出分数部分,即m
将被视为浮动变量
因此,m
永远不会是0它将是任何浮点数,表示0.123或2.122或1.0025
因为浮点asm
永远不会0如果条件if l
- 你犯了一个基本的错误。Python是动态类型语言
- 在讨论为什么会出现运行时递归错误之前,您需要做一个更改。
而不是m=l+(r-1)/2
writem=(l+r)/2
因为当您调用mergeSort(arr,0,n-1)
时,n-1
是最后一个索引值,这就是为什么m=l+(r-1)/2中不需要r-1
楼层分区操作员(//)与普通分区操作员(/)
现在来谈谈你为什么会得到递归错误的要点,答案如下
- 当你像这样做手术的时候
m=(l+r)/2
除法运算将给出分数部分,即m
将被视为浮动变量
因此,m
永远不会是0它将是任何浮点数,表示0.123或2.122或1.0025
因为浮点asm
永远不会0if条件if l