質問

factorial(n)を計算する関数があるとします

factorial(7)は、1から7までのnごとに7つの関数オブジェクトを作成します

必要に応じてこれらの値を使用します(factorial(7)* 8のようにfactorial(8)の場合)

役に立ちましたか?

解決

言語と言語の実装に依存します。

多くの関数型言語(Haskellなど)では、関数は何も変更しないことが保証されています。値を返すだけです。この副作用がないため、言語は関数呼び出しの結果を記憶/キャッシュ、または「メモ」することができます。

それほど洗練されていない言語では、7つの異なる関数呼び出しフレームがスタックに置かれ、ポップされます。

多くの関数型言語で適切に記述された階乗関数も末尾再帰的です。その場合、言語は、関数の下部から上部に単純にジャンプして、別の関数呼び出しの作成を回避することを選択できます。この場合、言語は再帰関数を「無料」ループに変えています。

他のヒント

場合によっては、再帰的階乗関数について話しているように聞こえます:

int factorial(int n) {
    return n>=1 ? n * factorial(n-1) : 1;
}

この関数は、再帰的に計算に必要な回数を呼び出します。与えられた階乗(n)。

ほとんどすべての再帰関数は、スタックを使用して連続した結果を蓄積することにより、反復解に変換できます...

int factorial(int n) {
    int accu = 1;
    int i;
    for(i = 1; i <= n; i++) {
        accu *= i;
    }
    return accu;
}

できます。あなたが求めているものはメモのように聞こえます-後で計算を高速化するために以前の結果を保存します。したがって、たとえば、9!を計算すると、1!の値を保存できます。 .. 9 !、そして8を要求されたら!後で、保存された値を返すことができます。同様に、10!を求められた場合、10×9!を計算できます。すぐに。

問題は、factorial( n )が非常に速く成長することです。 n の値が大きいと、大量のストレージを使用することになり、時空取引価値がないかもしれません。

メモ化を効果的に使用できる別の関数は、フィボナッチ数の計算です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top