作成 2010.01.23
更新 2010.01.24
C言語の練習 Level 2
問題

階乗の計算を行うプログラムを作成する。
それぞれの仕様を満たす fact 関数を作成せよ。
入力される値は 0 から 20 までの整数とする。

  1. for 文で計算する fact 関数を作成せよ。
  2. 再帰呼び出しで計算する 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言語

©2004-2017 UPKEN IPv4