<問題> フィボナッチ数は、以下の漸化式で定義される。 F (0) = 0, F (1) = 1 F (N) = F (N -1) + F (N - 2) (N > 1)
フィボナッチ数を求める再帰プログラムを作成せよ (定番のプログラム例題です)
<実行結果 例> n :7 fib (7) = 13 n :10 fib (10) = 55 n :45 fib (45) = 1134903170 (うっと思うほど、時間がかかるはず)
解答プログラムの下に、Windows での計測用プログラムあり
UNIXで実行できる場合は、解答プログラムの上のものを、timeコマンドで実行してみるとよい
実行ファイルをfibとするとき
time fib
n :45
fib (45) = 1134903170
real 0m32.773s (コマンド起動から終了までの時間。下のユーザCPU時間のほか、入出力の時間なども加算)
user 0m30.665s (ユーザのコマンドがCPUを使用した時間) (←ここに注目)
sys 0m0.007s (このコマンドにコマンド以外のシステム(OS)関係の処理が要した時間)
こちらの実行結果が出るかもしれません
time fib
n :45
fib (45) = 1134903170
9.615u 0.000s 0:10.77 89.2% 0+0k 0+0io 0pf+0w
コマンド起動から終了までに10.77秒 userに9.615 sysに0秒。
解答例 #include <stdio.h> int fib(int n); int fib(int n) { if (n == 0) return 0; else if (n == 1) return 1; else return fib(n-1) + fib(n-2); } int main (void) { int n; printf ("n :"); scanf ("%d", &n); printf("fib (%d) = %d \n", n, fib(n)); return 0; }
/* WINDOWSの場合の計測用プログラム clでコンパイル確認してあります。 gccは不可 */ #include <stdio.h> #include <Windows.h> int fib(int n); int fib(int n) { if (n == 0) return 0; else if (n == 1) return 1; else return fib(n-1) + fib(n-2); } int main(void) { _int64 startTime; /* 開始時間 PC起動からの経過時間 */ _int64 elapsedTime; /* 停止時間(経過後の時間) */ int n; printf ("n :"); scanf ("%d", &n); printf("-- start -- \n"); startTime = GetTickCount(); /* システム時間 */ printf("fib (%d) = %d \n", n, fib(n)); elapsedTime = GetTickCount(); /* 時間 */ printf("-- stop -- \n"); printf("elapsed time = %d ms \n", elapsedTime - startTime); /* 減算 */ return 0; }