作成 2010.01.23
更新 2010.01.24
更新 2010.01.24
C言語の練習 Level 2
問題
階乗の計算を行うプログラムを作成する。
それぞれの仕様を満たす fact 関数を作成せよ。
入力される値は 0 から 20 までの整数とする。
- for 文で計算する fact 関数を作成せよ。
- 再帰呼び出しで計算する fact 関数を作成せよ。
#include <stdio.h>
#include <stdlib.h>
long long int fact(long long int n){
/* ここを埋めるコードを記述 */
}
int main(int argc, char *argv[]){
int i = 0;
if(argc >= 2){
i = atoi(argv[1]);
}
printf("%d! = %lld\n", i, fact(i));
return 0;
}
解答例
解答 1
long long int fact(long long int n){
long long int f = 1;
for(; n>1; n--){
f *= n;
}
return f;
}
解答 2
long long int fact(long long int n){
if(n <= 1) return 1;
return n * fact(n - 1);
}
解説のようなもの
この問題は再帰呼び出しの理解度を測る。
0! = 1 に注意。n! = (n+1)!/(n+1) だから、0! = 1!/1 = 1 となる。解答 2 で言ったら、if(n <= 1) がこれに相当する。
ちなみに、if(n == 1) とした場合、0が入力されると無限に再帰呼び出しがかかるためスタックオーバーフローとなる。
まあ、難しくないだろう。
タグ: C言語