0

コード:

public static void main(String[] args) {
    System.out.println(test(13549));
}    

public static int test(int a){
    if(a<10)
        return a;
    int b = (a%10);
    int c = test(a/10);
    int d = Math.max(b,c);
    return d;
}

メソッドが何をするか (デバッガーを使用した後) を理解しています。また、メソッドが 10 未満になるまでそれ自体を呼び出し、b または c のどちらが大きいかを実行してチェックすることも理解しています。今私が理解していないのは、return ステートメントがあると、なぜのメソッドの先頭ではなくにreturn d;戻るのかということです。int c = test(a/10)int test(int a){

4

5 に答える 5

3

このreturnステートメントは、への呼び出しの出力をtest返します。したがって、行では、行return d;の値を返すだけです。test(a/10)c = test(a/10)

于 2013-03-18T21:39:56.827 に答える
1

これは再帰の基本的な考え方です。メソッドをそれ自体の中で呼び出すと、メソッドの最初に戻るだけではありません。

視覚的に:

1
|
|  2
|__|
|  |  3
|  |__|
   |  |  x
   |  |__|
      |  .
      |  .

各垂直線は関数の実行であり、水平線は再帰呼び出しです。

各呼び出しの後、呼び出されたメソッドのインスタンスの場所に効果的に戻ります。つまり、3回目の再帰では、単に戻るのではなく、スタック上に3つのバージョンの関数があります(メモリ内)。現在の関数の先頭に3回。

于 2013-03-18T21:47:25.083 に答える
0

コードをトレースするときは、(関数実行の) スタックがあると想像してください。関数が自分自身を呼び出していることがわかったら、新しい関数の実行をスタックの一番上に置き、関数が戻ったときにスタック要素を取り出します。

関数は、「基本ケース」に到達するまで、つまり a<10 になるまで、自分自身を呼び出し続けることがわかります。

return ステートメントの下にコードを置いても何の役にも立たず (一部の言語ではコンパイルすらできません)、関数が戻るとコードは実行されません。

于 2013-03-18T21:44:22.877 に答える
0

再帰関数を呼び出すたびに、関数の先頭から開始されます。再帰関数呼び出しの後に d を定義しているため、d に到達することはありません。a を返すことができるようになるまで、関数を再帰的に呼び出し続けます。

于 2013-03-18T21:49:37.330 に答える
0

これを呼び出すとtest(13549)、次のことが起こります。

test(13549){
   false
   b=9
   c= test(1354){
       false
       b=4
       c=test(135){
           false
           b=5
           c=test(13){
               false
               b=3
               c=test(1){
                  true
                  return 1
                }
                d=Max(3,1)
                return 3
              }
               d=Max(3,3)
               return 3
             }
             d=Max(5,3)
             return 5
           }
          d=Max(4,5)
          return 5
        }
    d=Max(9,5)
    return 9
  }

何らかの方法で計算を誤った可能性がある場合は申し訳ありません..しかし、すべての再帰呼び出しが終了し、最初の c hast が実際の値になるまで、最初の return ステートメントに到達しないことがわかります。

于 2013-03-18T22:02:25.367 に答える