-3

私は単純な再帰的な Java ファイルを持っています。コードは次のとおりです

public class Rekursion_SA_UE {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    count(1, 10);
}

public static int count(int zahl, int max)
{
    if(zahl>max) return zahl;
    else{
        System.out.println(zahl);
        count(zahl+1, max);
        return zahl;
    }
}

出力は 1,2,3,4,5,6,7,8,9,10 です。2 行を切り替えると、10 から下に向かってカウントされます。のように見えます

 public class Rekursion_SA_UE {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    count(1, 10);
}

public static int count(int zahl, int max)
{
    if(zahl>max) return zahl;
    else{
        count(zahl+1, max);//switched
        System.out.println(zahl);//switched
        return zahl;
    }
}

ここでの出力は 10,9,8,7,6,5,4,3,2,1 です。何故ですか?前もって感謝します。

4

2 に答える 2

4

これは、電話をかけるcountときと番号を出力するときが原因です。

最初のバージョンでは、 に再帰するzahl 前にcount出力するため、番号が順番に表示されます。このようなもの (10 ではなく 4 で停止します):

カウント(1, 4)
    出力 1
    カウント(2, 4)
        出力 2
        カウント(3, 4)
            出力 3
                カウント(4, 4)
                出力 4
                    カウント(5, 4)
                    戻る
                戻る
            戻る
        戻る
    戻る

2 番目のバージョンでは、を出力する前にzahl再帰するため、再帰 (10 レベル) まで進み、巻き戻しが始まると、最も深い (10) 最初に数値の出力を開始します。のようなもの (ここでも、10 ではなく 4 を使用します):

カウント(1, 4)
    カウント(2, 4)
        カウント(3, 4)
            カウント(4, 4)
                カウント(5, 4)
                    戻る
                出力 4
                戻る
            出力 3
            戻る
        出力 2
        戻る
    出力 1
    戻る

このような動作を理解するには、デバッガーを使用してコードを 1 ステップ実行します。2013 年には、コードが何をしているかを推測する必要はありません。それが実行されているのを見て、何が起こっているかを正確に見ることができます。

于 2013-11-10T12:04:36.530 に答える
1

それは再帰がどのように機能するかに関係しています。木のようです。最初のスニペットは次のようになります。

call(1)
    print(1)
    call(2)
        print(2)
        call(3)
            //etc.

2 番目のスニペットは次のようになります。

 call(1)
     call(2)
         call(3)
             //etc.
         print(3)
     print(2)
 print(1)
于 2013-11-10T12:08:01.443 に答える