7

Eclipse IDE の Java で階乗関数を実装しました。

public class Utilities {
   public static int factorial(int n) {
        int result;
    if (n <= 1) // base case
        return 1;
    else {
        result = (n * factorial(n - 1));
        return result;
    }
}
}

Eclipse での表示で、 を調べUtilities.factorial(6)ます。ただし、このエラーが発生します。

Utilities.factorial(6);
    Evaluation failed. Reason(s):
        Cannot perform nested evaluations.

ディスプレイが再帰呼び出しをサポートしていないのはなぜですか? それが問題ですか?

4

3 に答える 3

10

答えを返すには、式を評価する必要があります。そのためには、内部式を評価する必要があります。そのためには、内部式を評価する必要があります。そのためには、内部式を評価する必要があります。

一般に、デバッガーがスタックを吹き飛ばす (ネストされたスタック フレームが多すぎる) 場合、人々はデバッガーを作成する開発チームにバグを送信します。彼らは、現時点で知られている唯一の手段である再帰なしで問題を修正します。

再帰式について、ネストされた方法で式を評価せずに、スタックがどれだけ深くなる必要があるかを評価できる場合。ピカピカのフィールズ メダルがあなたを待っています (そしておそらく大学はあなたの名前で新しい建物を建設する準備ができています)。この問題は停止問題に関連しており、残念ながら、私たちのコンピューティング モデルでは、停止問題は解決できないことが知られています。

于 2012-05-15T21:45:12.583 に答える
4

犯人: 再帰

ほとんどの IDE はこの種の評価を行いません。これは Java とは関係なく、再帰と関係があります。Eclipse は再帰がどこまで進むかを知ることができないため、式を評価することさえ気にしません。そうしないと、JVM がハングするか (再帰にバグがある場合)、「ヒープ外」例外が発生する可能性があります。 、回復するのは難しいでしょう。

センチネルの数値を小さくしてみましたUtilities.factorial(1)か?

于 2012-05-15T19:21:44.940 に答える
-1

無関係: これが実際に使用したいメソッドである場合、再帰は適していません。最低限、関数を反復関数として書き直してください。ユースケースに応じて、this onethis oneなど、さまざまな近似を使用できます。

于 2012-05-15T21:35:10.043 に答える