第42章 階乗を求める  


今回は、階乗を求めるプログラムを作ってみましょう。 これも、どんな入門書にも載っています。 階乗とはn!(nは負でない整数)と書き

n! = n * (n-1) * (n-2)*....3 * 2 * 1

という意味です。また0!=1です。(そんなの知ってらあ!) では、早速プログラムを書いてみましょう。

ここで注意すべきことは、kaijo関数の中身でしょう。

xが0ならば1を返します。そうでないときは xにkaijo(x-1)を書けたものを返します。 帰る前にまたkaijo関数が呼ばれているので kaijo関数を実行します。そうするとxが0になるまで kaijo関数が呼ばれ続けます。

結局x * (x-1) * (x-2) *...* 2 * 1を返す ということになります。

このように、関数内で自分自身を呼び出すことを 再起呼び出し(recursive call)といいます。 階乗の計算が、必ず例に出されます。

さて、x * kaijo(x-1)のデータ型は kaijo関数の戻り値なのでlong型でなくてはいけません。 xはint型kaijo(x-1)は当然long型です。Cでは型の 異なる2項演算では大きい方の型に統一されます。 従ってxはlong型とみなされます。ですから return の値もlong型となり問題ありません。

アレ、途中から結果が変だ!

はい。階乗の値は急激に大きくなるので long型でもすぐに桁あふれが起こります。 long double型が使える処理系では long double型を使ってみましょう。

今度は、n!のnを入力するようにしました。 −1入力で終了します。

今度はかなり大きいnでも大丈夫ですね。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Dec/09/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。