簡體   English   中英

Python-MergeSort遞歸錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM