簡體   English   中英

在這種情況下,遞歸到底如何工作?

[英]How EXACTLY does recursion work in this case?

我是這個論壇的新手,希望我不會犯任何錯誤。 這是我的問題。 我想我了解遞歸及其實現的基本原理,但是在理解遞歸代碼執行時計算機正在執行的確切步驟時遇到了一些問題。

這是一個例子:

公共班級主要{

public static void MyAlgorithm (int [] A, int l, int r ) {
    if (l<r) {
        int m = (l+r)/2;
        MyAlgorithm(A, l, m);

        for (int i = l; i<=r; i++) {
            System.out.println(A[i]);
        }

        MyAlgorithm(A, m+1, r);
    }


}
public static void main (String args[]) {

    int [] A = {1,2,3,4};

    MyAlgorithm (A, 0, 3);
}

}

輸出為:12123434

但是,這到底如何工作? 首先,代碼將m計算為2。然后再次在子數組(1,2)上執行該方法,並將其放入堆棧中。 然后再次執行,取一半並將1放入堆棧。 據我了解的問題,它然后停止,從堆棧中彈出1並進行打印。 但是何時將2分別放在堆棧上? 以及何時准確地從另一半開始遞歸部分? 我根本無法真正理解計算機如何執行單個步驟以及如何“知道”何時開始遞歸調用數組的另一半。 希望您能理解我的問題,感謝您的答復!

提前致謝 :)

執行調用將是這樣的

MyAlgorithm(A,0,3) 
    (l < r : true)
     m = (0+3)/2=1
     MyAlgorithm(A,0,1) 
            (l < r : true) 
            m = (0+1)/2=0
            MyAlgorithm(A,0,0) 
                (l < r : false) return

            loop from l=0 to r=1
            System.out.println(A[0]);
            System.out.println(A[1]);

            //MyAlgorithm(A,m+1,r)
            MyAlgorithm(A,1,1) 
                (l < r : false) return

    loop from 1=0 to r=3
    System.out.println(A[0]);
    System.out.println(A[1]);
    System.out.println(A[3]);
    System.out.println(A[4]);

    //MyAlgorithm(A,m+1,r)
    MyAlgorithm(A,2,3)
        (l < r : true)
        m=(2+3)/2 = 2
        MyAlgorithm(A,2,2)
            (l < r : false) return

    loop from 1=2 to r=3
    System.out.println(A[2]);
    System.out.println(A[3]);

    MyAlgorithm(A,3,3)
            (l < r : false) return      
return

這導致答案:12123434

暫無
暫無

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

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