0

基本ケースをテストせずに、つまりfor 0 と 1を実行せず1に、呼び出し時にこの再帰メソッドを返すにはどうすればよいですか。0!if-else

public static long f( number ){
        if ( number <= 1 ){ // test for base case
                return 1; // base cases: 0! = 1 and 1! = 1
            } 
        else{ return number * f( number - 1 ); }
   }

基本ケースをチェックしたくありません。これは可能ですか?

4

7 に答える 7

2

基本ケースが必要ですが、ケースのみをチェックする必要があります0(完全性のために0未満も)。そうしないと、無限ループで(またはスタックオーバーフローに達するまで)実行されます。ただし、コードを短縮できます。

public static long f(int n){
    if (n<0) throw new InvalidParameterException();
    return n == 0 ? 1 : n * f(n-1);
}
于 2011-10-27T15:18:59.373 に答える
2

さて、あなたがそれを呼ぶ基本的なケースは、再帰を停止する条件です...どのようにテストせずに再帰を停止したいですか?

一方、反復バージョンはより高速になるはずです。

于 2011-10-27T15:19:54.093 に答える
1

再帰を有限にするために、再帰の基本ケースチェックが常に必要です。ところで、0のベースケースは階乗定義にあります。

于 2011-10-27T16:34:05.903 に答える
0

if-else or を使用する? :のが最善の解決策です。つまり、他のものはもっと悪くなる可能性があります。

public static long f(int n){
  try {
    return 0 / n + n * f(n-1);
  } catch(ArithmeticException ae) {
    return 1;
  }
}
于 2011-10-27T15:38:20.840 に答える
0

他の人が言うように、基本ケースが必要ですが、それを確認する必要はありません。以下は非常に悪いコードにつながるため、自宅でこれを試さないでください。それは単なる概念実証です。

関数の配列 (インデックス 0 ~ 21) を定義します。各関数はパラメータを取りますn。インデックス 0 の関数は任意の に対して 1 を返しn、他のすべてnの関数はインデックス の関数の戻り値の時間を返しますn-1。index で関数を呼び出すことから始めますn。if-else、何もチェックしません。

21!指定された戻り値の型long(64 ビット) でオーバーフローが発生し、結果が未定義になるため、配列サイズは 21 で十分です。OutOfBound 例外を回避したい場合は、関数を呼び出すラッパーを追加できますmin (n, 21)

于 2011-10-28T20:22:21.637 に答える