2017-02-27 121 views
0

我看到一些帖子,瞭解歸併排序。我知道遞歸方法維護堆棧來保存值。 (我明白的是return語句的結果將是在棧)瞭解遞歸與歸併排序

private int recur(int count) { 
    if (count > 0) { 
     System.out.println(count); 
     return count + recur(--count); // this value will be in stack. 
    } 
    return count; 
} 

我困惑的合併排序如何堆在這裏維護。

private void divide(int low, int high) { 
    System.out.println("Divide => Low: "+ low +" High: "+ high); 
    if (low < high) { 
     int middle = (low + high)/2; 
     divide(low, middle); // {0,7},{0,3}, {0,1} ; 
     divide(middle + 1, high); // {0,0}; high = 1; // 2nd divide 
     combine(low, middle, high); 
    } 
} 
  1. 是堆棧的所有局部變量?
  2. 當第二次遞歸方法調用時,第一次遞歸也會加入? 在這種情況下如何維護堆棧?
+0

[這](https://www.youtube.com/watch?v=zkdwpdHLuII)最能解釋它。 –

+0

你會更簡單地理解遞歸問題。甚至在此之前,您應該查看堆棧是什麼,調用函數以及將哪些值壓入堆棧,如何將返回值傳播給調用方以及如何將參數傳遞給函數。 –

回答

0

你只需要知道一個語句需要完成並返回,你從divide調用dividecombine的工作原理相同。兩者都需要在可以執行下一行代碼之前完成,或者如果沒有更多行,則函數返回。是的,它是用堆棧完成的,但它並不重要。

  1. 侍應生變量lowhighmiddle的狀態僅在當前調用映射,所以他們沒有得到與其他調用混合。

  2. 每次巢新調用它得到它自己的變量,每個人都需要完成。當中低音結束時,它會調用中音+ 1高音,並在中音結束時結束。這些調用將執行相同的操作,因此您將擁有更深的嵌套以及調用結構將如何訪問,就像二叉樹結構,葉子是low == high(一個元素)。

一句忠告。在查看遞歸代碼時,嘗試從葉到更復雜的樹。例如。先試用基本案例,然後再選擇最簡單的默認案例。例如。

  1. 1元件陣列:什麼也不做
  2. 2元件陣列: - > 1門元件陣列(參照1),1個元件陣列,結合
  3. 4元件陣列: - > 2元件陣列(見第2 ),2元素數組,合併

請注意,2.你知道這兩個遞歸調用不會做任何事情,combine也許會做一個交換。 3.在combine之前做兩次(包括交換),這將合併排序的2 2個元素數組。你可能以另一種方式看待它,這就要求你暫停3.做2.停止它並做1.,然後下一個1,然後回到2.做兩個1的文本......它需要筆和紙。用葉子到根的角度來看,使用迄今爲止所學到的知識可以讓你更容易理解它。我認爲功能遞歸比改變像合併排序這樣的結構更容易掌握。例如。斐波納契序列。