タグ
  ANSI (1)
  ASP.NET (10)
  Active Directory (55)
  BAT (16)
  Backup (2)
  CSharp (11)
  CentOS (4)
  C言語 (4)
  DNS (4)
  Excel (3)
  FFmpeg (1)
  Fedora (4)
  FreeBSD (6)
  IPv6 (3)
  Java (11)
  JavaScript (8)
  LAN (1)
  Link (4)
  Linux (15)
  Mac (1)
  Mail (2)
  Microsoft (3)
  NIS (1)
  Node.js (6)
  OpenIndiana (1)
  OpenLDAP (2)
  OpenSSL (1)
  OpenSolaris (4)
  PHP (2)
  Perl (2)
  Postfix (1)
  PostgreSQL (2)
  PowerShell (34)
  RFC (3)
  SQL Server (5)
  Solaris (10)
  Ubuntu (9)
  VBScript (73)
  VCpp (2)
  VMware (3)
  Visual Basic (1)
  WMI (17)
  WSF (5)
  WSH (10)
  Windows (19)
  bash (1)
  bind (1)
  iSCSI (1)
  おまけ (3)
  作成中 (8)
  慣用句 (3)
  正規表現 (6)
  運用 (8)
作成 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-2012 UPKEN IPv4