[英]Python - MergeSort Recursion Error
我使用遞歸在python中制作了一個MergeSort程序,但不斷收到有關第27行,第23行,第18行的錯誤和遞歸錯誤:
“ RecursionError:在比較中超出了最大遞歸深度”,但是我似乎在代碼中沒有發現任何明顯的錯誤。
def merge(list, start, middle, end):
L = list[start:middle]
R = list[middle:end+1]
L.append(99999999999)
R.append(99999999999)
i = j = 0
for k in range(start, end+1):
if L[i] <= R[j]:
list[k] = L[i]
i += 1
else:
list[k] = R[j]
j+=1
def mergesort2(list, start, end):
if start < end:
middle = (start + end)//2
mergesort2(list, start, end)
mergesort2(list, middle+1, end)
merge(list, start, middle, end)
def mergesort(list):
mergesort2(list, 0, len(list)-1)
mylist = [8,23,4,56,75,21,42,10,2,5]
mergesort(mylist)
print(mylist)
謝謝
def mergesort2(list, start, end):
if start < end:
middle = start + (end - start)//2
mergesort2(list, start, middle) // notice middle instead of end.
mergesort2(list, middle+1, end)
merge(list, start, middle, end)
您在不減小其大小的情況下遞歸了相同的列表,因此它永遠不會達到基本情況。
編輯:此外,中間值應由start + (end-start)/2
而不是(start+end)/2
,以避免在使用大數組時出現整數溢出錯誤。 這是一個好習慣。
編輯2:在分析了更多代碼后,我發現輸出是錯誤的。 我試圖糾正它們,這是我的代碼:
def merge(start, middle, end):
L = l[:middle]
R = l[middle:]
i = j = k = 0
while i < len(L) and j < len(R):
if L[i] <= R[j]:
l[k] = L[i]
i += 1
else:
l[k] = R[j]
j+=1
k += 1
while i < len(L):
l[k] = L[i]
i += 1
k += 1
while j < len(R):
l[k] = R[j]
j += 1
k += 1
def mergesort2(start, end):
if start < end:
middle = start + (end - start)//2
mergesort2(start, middle)
mergesort2(middle+1, end)
merge(start, middle, end)
def mergesort(l):
mergesort2(0, len(l)-1)
l = [8,23,4,56,75,21,42,10,2,5]
mergesort(l)
print(l)
需要注意的幾點:
將變量名稱從list
更改為l
以避免與關鍵字list
混淆。
將列表傳遞給每個函數沒有用,因為它已經被聲明為全局變量。
merge()
有一些問題。 循環實際上應該從0
運行,直到兩個列表的長度都沒有越過為止。 如果交叉,則只需復制其余元素。
使用了適當的Python拼接技術:-p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.