3

特定の値の階乗数を調べるためのコード スニペットがあります。スニペットをデバッグして、コード フローを見つけようとしました。しかし、それでも私はその流れについて混乱しています。以下は私が持っているコードスニペットです。フローを理解するのを手伝ってくれる人はいますか?

static void Main()
{
   long value = factorial(5);
}

static long factorial(long num)
{
   if (num <= 1)
        return 1;
   else
        return num * factorial(num - 1);
} 
4

5 に答える 5

2

これは再帰関数であり、異なる入力で自分自身を呼び出すことを意味します。「ベース」ケースと呼ばれることが多い停止点に到達するまで、自分自身を呼び出し続けます。基本ケースに到達すると、すべての関数呼び出しは整数の戻り値を生成します。つまり、戻り値が最初の呼び出しまでずっと評価されるため、乗算が行われる可能性があります。最初は頭を包み込むのは本質的に奇妙なことですが、理解するのに非常に役立つ概念です。

最後に: 階乗は、再帰がどのように機能するかを説明するためによく使用されますが、それを使用すべきでない場合の最も明確なケースでもあります。階乗は、for ループを使用してより適切に解決できます。再帰の最も一般的な使用例は、手順を何回繰り返さなければならないかわからない場合です。N-factorial は、何かを n 回実行する必要があることが既に決定されているため、そのための良い候補ではありません。

于 2013-07-15T05:18:44.707 に答える
1

再帰とは、関数が自分自身を呼び出すときです。再帰関数を使用すると、複雑な問題を簡単に処理できる同一の単一の単純なケースに分割できます。これは、よく知られたコンピューター プログラミング手法でもあります。分割統治法です。

于 2013-07-15T05:45:55.107 に答える
1

メソッドは再帰的です。つまり、それ自体を呼び出します。連続して呼び出すたびに、現在の数値が 1 ずつ減ります。例: 5 の階乗: 5*4*3*2*1 = 120。

階乗は次のように機能します。

Original number: 5
(5)*(5-1)*(5-2)*(5-3)*(5-4)

現在の数値が 1 以下 (0) になると、メソッドは前の値を 1 で乗算します。これは、メソッドに最初に渡された数値が1またはである場合にも役立ちます。これは、との0両方が 1 であるためです。0!1!

于 2013-07-15T05:14:31.873 に答える
1

Recursive Methods in c#は、同じトピックに関する興味深い読み物です。

Recursive には通常、次の 2 つの仕様があります。
-> Recursive メソッドは、満足するまで何度も自分自身を呼び出します。
-> 再帰メソッドにパラメーターがあり、新しいパラメーター値でそれ自体を呼び出します。

再帰ウィキによる階乗

于 2013-07-15T05:15:09.103 に答える