簡體   English   中英

合並排序算法中的中斷遞歸

[英]breaking recursion in merge sort algorithm

當 [] 列表傳遞給 mergesort_helper() 時,遞歸不會中斷。 我嘗試添加案例來檢查 None 和 len < 0 並仔細檢查了調試器。 有什么建議?

def mergesort(lyst):
    """Mergesort Algorithm"""
    def mergesort_helper(lower, upper):
        RecursionCounter()
        merged_lyst = []
        while len(lower) > 0 and len(upper) > 0:
            if lower[0] < upper[0]:
                merged_lyst.append(lower[0])
                lower.pop(0)
            else:
                merged_lyst.append(upper[0])
                upper.pop(0)

        while (len(lower)) > 0:
            merged_lyst.append(lower[0])
            lower.pop(0)

        while (len(upper)) > 0:
            merged_lyst.append(upper[0])
            upper.pop(0)

        return merged_lyst

    validate_list(lyst)
    if len(lyst) == 1:
        return lyst
    mid_index = len(lyst) // 2
    if len(lyst) is not None:
        lower = mergesort(lyst[0:mid_index])
        upper = mergesort(lyst[(mid_index + 1):])
        return mergesort_helper(lower, upper)
    return

實現流程的關鍵在這里:

if len(lyst) is not None:

這將始終帶您進入分支執行。 len返回一個int 該值永遠不能None 這是你無限遞歸的來源。

您混淆了None0和空列表的概念。 盡管如果將它們強制為布爾值,它們中的每一個都會評估為False ,但它們並不相等。 清理你的調用返回序列:決定什么一個類型,你會從每個函數返回,並堅持下去。 使您的調用函數僅使用該返回值。 插入有用的print命令來跟蹤值: if比發布堆棧溢出問題所需的時間少得多,這種簡單的技術將顯示失敗。 例如:

print("mid_index=", mid_index)
print("lyst     =", lyst)
if len(lyst) is not None:
    print("Here I go again!")
    lower = mergesort(lyst[0:mid_index])
    upper = mergesort(lyst[(mid_index + 1):])
    print("Divided into two pieces:", lower, upper)
    return mergesort_helper(lower, upper)

print("lyst is None; returning None")
return None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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