[英]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
。 這是你無限遞歸的來源。
您混淆了None
、 0
和空列表的概念。 盡管如果將它們強制為布爾值,它們中的每一個都會評估為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.