作成 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言語