簡體   English   中英

歸並排序中的遞歸,快速排序和樹的遍歷

[英]Recursion in Merge Sort , Quick Sort and traversal of trees

在學習不同的算法(如合並排序、快速排序或樹遍歷)時,我觀察到有兩個遞歸調用緊隨其后。

完全看不懂,請簡單解釋一下為什么要使用兩個遞歸調用? 這是任何一種模式嗎?

還有任何算法可以進行兩次以上的立即遞歸調用嗎?

歸並排序

m_sort(numbers, temp, left, mid);

m_sort(numbers, temp, mid+1, right);

樹遍歷

預購(節點。左)

預購(節點。右)

有兩個遞歸調用,因為相同的功能需要在兩個不同的位置執行。 在從根開始遍歷樹的情況下,您要遞歸地從左向下再向右向下。 函數調用工作的方式, F調用preorder(node.left)而對preorder(node.right)一無所知。 當它進入node.left它現在位於B 將會一直進行相同的遞歸調用,直到底部A為止。 當預購(node.left)從返回A 在代碼中B調用preorder(node.right)和遞歸將繼續。

這並不是一種模式,而是在許多二進制結構上進行遞歸工作的本質,其中采用分而治之策略將工作拆分成較小的部分,然后分別對每個部分執行遞歸直到瑣碎滿足大小寫(例如,返回時,如A沒有子節點的節點)

維基百科的預遍歷

來源: Sorted_binary_tree.svg的Sorted Binary tree preorder ”: Miles衍生作品: Pluke交談-Sorted_binary_tree.svg 通過Wikimedia Commons在公共領域許可。

你想調用它兩次的原因是因為它把問題分成了兩半。

對於排序情況,您希望對下半部分和上半部分進行排序。 在樹的情況下,您要遍歷左軌道和右軌道。 恰好這個數字是 2,因為您在每次遞歸中將域分成兩半。 但是你可以將問題分成你想要的部分,有些問題甚至可能在每次遞歸中都有可變數量的部分。

一個簡單的想象方法,當你站在十字路口時,你會考慮從那里可以去多少個方向,如果你想訪問所有的方向,那么你需要調用所有的方向。

暫無
暫無

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

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