簡體   English   中英

合並排序函數上的遞歸令人困惑

[英]Recursion on a merge sort function is confusing

我了解遞歸的基本原理,在處理簡單的事情(例如計算數字的階乘)時,它一點也不混淆,這是遞歸的最基本用法。 但是,當您在更復雜的環境中開始使用遞歸時,它對我來說真的很令人困惑。

就我而言,我想創建一個函數,該函數使用“合並排序”方式通過遞歸對列表中的項目進行排序。 所以我開始工作,這是我第一次嘗試時想到的(不是我真的必須解決一些錯字):

def merge_sort(ls):
  size = len(ls)
  if size <= 1:
    return ls
  left = merge_sort(ls[:size/2])
  right = merge_sort(ls[size/2:])
  return merge(left, right)

def merge(left, right):
  ls = []
  ln1 = len(left)
  ln2 = len(right)
  length = ln1 + ln2
  while length > 0:
    if not left:
      ls.append(right.pop(0))
      length -= 1
    elif not right:
      ls.append(left.pop(0))
      length -= 1
    else:
      if left[0] < right[0]:
        ls.append(left.pop(0))
        length -= 1
      elif right[0] < left[0]:
        ls.append(right.pop(0))
        length -= 1
  return ls

print merge_sort([8,5,4,6,1])

我單擊運行,它起作用了,但是我不明白為什么它起作用。 是的,我創建了一段代碼,該代碼可以完成預期的工作,但我不明白為什么。

因此, “ merge_sort”將列表分為兩部分,直到有一個包含單個項目的簡單列表為止。 它使用遞歸進行此操作,當我們獲得一個包含單個項目的簡單列表時,它將其分配給一個新列表,即leftright 然后,我在“合並”功能中使用這2個新列表對它們進行排序,並以正確的方式將它們合並在一起。 到目前為止,一切都很好,但是當我點擊“執行”時,我期望代碼在前兩個項目處停止並打印一個包含2個已排序項目的小列表。 但是“ merge_sort”一直在繼續。 即使我相信它應該在執行后結束:

return merge(left, right)

現在這是我的問題。 為什么它返回“ merge_sort”的開頭,又如何保存舊值而又不弄亂 “ merge”生成的新排序的“小列表呢? 希望我的問題對您有意義。

謝謝您的幫助!

答案很廣泛。 為了完全理解這一點,您需要了解堆棧構建如何與遞歸一起工作以及所述構建中的指針如何工作。

遞歸調用此方法是因為需要通過將列表分成兩半來分解,直到達到最小可能的單位(剩余的1或0)。一旦完成,堆棧構建將使用其預定義的指針來追溯所有先前的通話實例。

這是一個深入的編程語言概念。

有關堆棧構建和回調參考的更多信息,請參見此處。 https://en.wikipedia.org/wiki/Call_stack

暫無
暫無

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

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