4

再帰の例だと思うものを作りました。これは受け入れられますか?プロジェクトでも何でもなく、私の教授はひどいので、私は自分自身を教えようとします.

public void theCat() {
  int i;
  for (i = 0; i <= 50; i++) {
    System.out.println(i);
    if (i == 10) {
      theCat();
    }
  }
}
4

5 に答える 5

7

はい、それが再帰です。ただし、絶対に止めないので無限大です。

あなたがすべきことは、再帰を停止する時が来たかどうかを確認する基本ケースを持つことです。次のように、パラメーターを基本ケースに収束させる縮小ステップもあります。

public int theCat(int i) {
    if (i => 50) 
        return i;
    else
        return theCat(i + 1);
}

この有効性を示すために、再帰階乗法を見てみましょう。

private long factorial(int n) {
    if (n == 1)
        return 1;
    else
        return n * factorial(n-1);
}

ここで、基本ケースは、計算しようとしているかどうかをチェック1!し、その場合は を返します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
于 2013-10-30T19:04:22.457 に答える
0

再帰呼び出しが無限であるため、スタック オーバーフローが発生します。

再帰を次のように定義できます: 1. 特定の状態を持つメソッドから開始します 2. このメソッド内でメソッド自体が呼び出されますが、呼び出しによってメソッドの状態が変更されます 3. メソッドには基本ケース (aメソッドがこの状態に達すると、再帰的に呼び出されなくなります)。

于 2013-10-30T19:16:19.453 に答える
0

これにより、オーバーフローが発生します。すべての再帰には、無限に進まないように、終了するための何らかの基本ケースが必要です。
さらに、すべての再帰関数は通常、ある種の int または何らかの値を受け取るため、基本ケースでその値を使用して終了できます。したがって、あなたの例では、 int i を引数として cat に送信し、停止したときに停止しますi == 50

于 2013-10-30T19:04:59.083 に答える
0

はい。ただし、メソッドからの終了を決定するフラグが必要です。そうでない場合は、StackOverFlowErrorをキャッチします

于 2013-10-30T19:06:11.030 に答える
0

はいといいえ。技術的には、これは再帰の一例です。しかし、これで終わることはありません。通常、再帰メソッドには、再帰しない「基本ケース」を認識できるように、いくつかのパラメーターが渡されます。

于 2013-10-30T19:05:16.743 に答える