Tips

C言語練習問題

C言語練習問題

環境について

C言語の練習問題です。

開発環境は以下の通り。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート)

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

コンパイラ:MinGW-w64 5.3.0 (posix, sjlj)

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

※※各問題へのリンク一覧を作成しました。

 

問題

フィボナッチ数列という数列は、自身の一つ前と二つ前の項を足し算することで値がわかる数列※である。

※数学的に厳密な定義が必要な場合は自身で調べてください。

例えば第n項をa(n)と書くとすると、

a(3) = a(2) + a(1)

a(100) = a(99) + a(98)

a(n) = a(n-1) + a(n-2)

と書ける。この数列をシミュレーションするために

次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。

 

プログラム(test33.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdint.h>
 
int fib(int n);
 
int main(void){
  int num = fib(6);
  printf("num = %d\n", num);
  return 0;
}
 
int fib(int n){
  if(n == 1){
    return 1;
  }
  return fib(n - 1) + fib(n - 2);
}

 

問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。

A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。

なお、コマンドを入力する前はディレクトリ内のファイルはtest33.cのみであった。

1
gcc -o test33.exe test33.c

 

選択肢A,B,C

A.コンパイルに成功して( 空欄1 )が生成される。

B.( 空欄1 )ためコンパイルエラーが起こる。

C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。

 

 

問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。

1
test33

 

選択肢A,B,C

A.ファイルが実行され( 空欄1 )と画面に表示される。

B.( 空欄1 )というファイルがないため実行できない。

C.コンパイルはされているが、( 空欄1 )という問題があるため実行は危険である。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

問1

A.コンパイルに成功して( test33.exe )が生成される。

 

問2

C.コンパイルはされているが、( fib関数が無限に再帰呼び出しをする )という問題があるため実行は危険である。


 

解説

問1,問2

今回はフィボナッチ数列を再帰関数を利用してシミュレーションしようとしている。しかし、この関数は1以外の引数で呼び出すと、再帰的に自分自身を呼び出すことになる。

もしfib(3)を呼び出すと、fib(2)とfib(1)が呼び出される。この際、fib(1)はそれ以上再帰呼び出しを行わないが、fib(2)はfib(1)とfib(0)を再帰呼び出しする。fib(0)はfib(1)とは異なり、fib(-1)とfib(-2)を再帰呼び出しするため、再帰呼び出しが止まらない。したがって、実行すると無限ループしてしまう。

 

無限ループしないようにしたければ、例えば以下のように書くなど、再帰呼び出しが必ず止まるようにする必要がある。

なお、以下のプログラムではフィボナッチ数列のa(0)の項や、負の数に対する定義は考えていない。数学で利用する(シミュレーションする)必要があるなどの場合は別途調べて関数を組むこと。

プログラム(test33_1.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdint.h>
 
int fib(int n);
 
int main(void){
  int num = fib(6);
  printf("num = %d\n", num);
  return 0;
}
 
int fib(int n){
  if(n < 1){
    return 0;
  }
  if(n == 1){
    return 1;
  }
  if(n == 2){
    return 1;
  }
  return fib(n - 1) + fib(n - 2);
}

実行結果

1
2
3
>gcc test33_1.c -o test33_1.exe
>test33_1
num = 8

 

 

他の問題へのリンク一覧はこちら

 

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search