0

「数値の階乗を見つける方法」をグーグルで検索すると、これについて多くの答えが得られました...

それらの例の1つは...

private double getFactorial(double f){
    if ( f == 0 ) 
        return 1;
    return (f * getFactorial(f - 1));
}

そしてそれは機能します...しかし、Windows電卓は私を驚かせました:それは10進数にも機能します!!

例: Windows 電卓では、の階乗0.50.886226925...

それは望ましい動作ですか?階乗は非整数に対して定義されていますか?

4

4 に答える 4

3

私のコメントを答えにする:

階乗は、ガンマ関数を介してほぼすべての数値 (実数/複素数/非整数) に一般化できます。

まだ定義されていない唯一のポイントは、特異点による負の整数の場合です。(これは、階乗の再帰恒等式を逆にすることで簡単に確認できます。 から0!へ行く(-1)!と、0 による除算になります。)

明らかに、コードは整数に対してのみ機能します。それ以外の場合は、無限再帰に入り、スタックオーバーフローが発生します。


整数の場合、単純なループまたは再帰を使用して簡単に計算できます。しかし、それ以外のことを行うのははるかに困難です。

非整数点で階乗/ガンマ関数を評価するための 2 つの主要なアルゴリズムがあります。

ウィキペディアには、Python での後者の実装があります。

于 2011-11-26T05:17:57.777 に答える
0

正確には、階乗関数はすべての非負の整数で正確に定義された関数です。

ガンマ関数は階乗関数ではありません。複素数の関数です。gamma(n)は(n-1)を計算します!naの正の整数。

階乗関数は、設計どおりに正確に動作する必要があります。これ以上でもそれ以下でもありません。

于 2011-11-26T07:13:52.880 に答える
0

数値の階乗を見つけたい場合は、long/int の戻り値の型と long/int 型のパラメーターを使用して宣言する必要があります。階乗は非負の整数に対してのみ機能するためです。例

private long getFactorial(int f) {

   if ( f == 0 ) 
        return 1; //0!=1
   return (f * getFactorial(f - 1)); //basic recursive formula

}

たとえば、(-1.1) を見つけようとすると、コードは無限ループ (または少なくともスタック オーバーフロー) に入ります。または (0.001)! ...

また、Windows電卓で何が起こっているのかわかりません(たとえば、1.5!は1.3293403881791370204736256125059を返します)が、これが役立つと思います:http://en.wikipedia.org/wiki/Gamma_function

于 2011-11-26T05:18:19.420 に答える
0

階乗は、ガンマ関数を使用して実数に一般化できます。G(x) を x のガンマとし、P(x) を x の一般化階乗 ( Pi 関数とも呼ばれます) とします。G(x) と P(x) の関係は P(x)=x*G(x) です。

G(0.5) は sqrt(pi)=sqrt(3.141592...) であることがわかります。したがって、P(0.5)=0.5*sqrt(3.141592...)=0.5*1.772453...=0.886226...

有名な pi 数がたまたま G(x) の値の一部であるという事実と、他の関数が Pi 関数と呼ばれるという事実との間に直接的な関係がないことに注意してください。

于 2011-11-26T05:21:35.787 に答える