0

誰かがこの解決策を理解するのを手伝ってくれませんか。助けてくれるということは、私が理解できるのと同じくらい愚かな人がすべてを繰り返すのを手伝ってくれるということです。どうもありがとう :(

         public void recurse(int n, char one, char two, char three)
         {
               if(n == 1)
               System.out.println(n + " " + one + " " + two);
               else
               { 
                   recurse(n - 1, one, three, two);
                   System.out.println(n + " " + one + " " + two);
                }
          }

関数呼び出し:

          recurse (4, 'A', 'B', 'C');
4

5 に答える 5

1

this.recurse (4, 'A', 'B', 'C');

第 1 ラウンド: n は ==1 ではありません -->recurse(3, 'A', 'C', 'B');

第 2 ラウンド: n は ==1 ではありません -->recurse(2, 'A', 'B', 'C');

第 3 ラウンド: n は == 1 ではありません -->recurse(1, 'A', 'C', 'B');

4 回目: n ==1 --> コンソール出力: "1 A C"

再帰チェーンに戻ります。

コンソール出力: "2 A B"

コンソール出力: "3 A C"

コンソール出力: "4 A B"

コンソールの最終出力は次のようになります

1 A C
2 A B
3 A C
4 A B
于 2013-11-01T06:23:37.870 に答える
1

メソッドがその行から再帰的に呼び出されるたびに切り替わります - 何回再帰的に呼び出されますか? メソッドが呼び出されるたびに、パラメーターは他の呼び出しとは異なることに注意してください。– user201535

このユーザーは私にとって非常に明確でした。もう一度ありがとう。

于 2013-11-01T06:23:55.387 に答える
1

ある関数を別の関数から呼び出すという考えは、関数が自分自身を呼び出す可能性をすぐに示唆します。Java の関数呼び出しメカニズムは、再帰と呼ばれるこの可能性をサポートしています。再帰は強力な汎用プログラミング手法であり、情報処理の基本的なサポートを提供する組み合わせ検索および並べ替えメソッド (第 4 章) から信号処理の高速フーリエ変換 (第 4 章9)。

初めての再帰プログラム。再帰の HelloWorld は階乗関数を実装することです。これは正の整数 N に対して次の式で定義されます。

N! = N × (N-1) × (N-2) × ... × 2 × 1 

ん!for ループで簡単に計算できますが、Factial.java でのさらに簡単な方法は、次の再帰関数を使用することです。

public static int factorial(int N) { 
   if (N == 1) return 1; 
   return N * factorial(N-1); 
} 

factorial() が 1 = 1 を返すことに注意することで、目的の結果が生成されることを自分自身に納得させることができます! N が 1 の場合、値が適切に計算される場合

(N-1)! = (N-1) × (N-2) × ... × 2 × 1 

次に、値を適切に計算します

N! = N × (N-1)! = N × (N-1) × (N-2) × ... × 2 × 1 

関数呼び出しのシーケンスをトレースするのと同じ方法で、この計算をトレースできます。

factorial(5) 
   factorial(4) 
      factorial(3) 
         factorial(2) 
            factorial(1) 
               return 1 
            return 2*1 = 2 
         return 3*2 = 6 
      return 4*6 = 24 
   return 5*24 = 120

factorial() の実装は、すべての再帰関数に必要な 2 つの主要コンポーネントを示しています。

The base case returns a value without making any subsequent recursive calls. It does this for one or more special input values for which the function can be evaluated without recursion. For factorial(), the base case is N = 1.

The reduction step is the central part of a recursive function. It relates the function at one (or more) inputs to the function evaluated at one (or more) other inputs. Furthermore, the sequence of parameter values must converge to the base case. For factorial(), the reduction step is N * factorial(N-1) and N decreases by one for each call, so the sequence of parameter values converges to the base case of N = 1. 


Now in your case (n==1) is the base condition or terminating condition.
recurse(4,'A','B','C')
  recurse(3,'A','C','B')
     recurse(2,'A','B','C')
        recurse(1,'A','C','B')

        return : 1 A C
     return : 2 A B
   return : 3 A C
return : 4 A B

final output : 
1 A C
2 A B
3 A C
4 A B
于 2013-11-01T06:47:22.870 に答える
0

まず、最後の行 recurse (4, 'A', 'B', 'C'); に移動します。これは「再帰」呼び出しという名前の関数であり、(int n、char one、char two、char three) に対応するパラメーターを渡します。

関数が呼び出され、params に渡されると、(n == 1) の値がチェックされ、この条件が有効である場合、このステートメントを通じて「n」、「1」、「2」の値が書き込まれます。 .out.println(n + " " + 1 + " " + 2);

この (n == 1) 条件が有効でない場合は、else { recurse(n - 1, one, three, two); にジャンプします。System.out.println(n + " " + one + " " + two); ここで再帰が発生しています。これは、関数「recurse」が自身の本体で何度も自分自身を呼び出していることを意味します。

今、それがelseの本体に入るとき-そしてそれはそうするので、recurse(n - 1, one, three, two);を呼び出します。関数 recurse が再び実行されます。これは n = 1 まで、つまり 4 回目の反復で発生します。機能が完了します。

于 2013-11-01T06:28:27.373 に答える