演習0 func0, func1, func2を作成せよ. main()関数の中で,func0()を呼び出しを実行せよ. func0の中身は,「“func0A”と表示し,func1を呼び出し,“func0B”と表示する」. func1の中身は,「“func1A”と表示し,func2を呼び出し,“func1B”と表示する」. func2の中身は,「“func2”と表示する」. main()関数の中で,func0()を呼び出しを実行せよ. main()の中で,func0()の中でfunc1を呼び出し,func1()の中でfunc2を呼び出すことになる. 実行結果は次のスライド
演習0 (con’t) 実行結果は以下のとおり func0A func1A func2 func1B func0B
演習1-0 再帰を用いて,n!(階乗)を求める関数を作成せよ. 引数に1を指定してmainから呼び出し,戻り値を表示せよ.
演習1-1 再帰を用いて,n!(階乗)を求める関数を作成せよ. 関数内にprintf()を入れ,動作を追跡せよ. 引数に10を指定してmainから呼び出し,戻り値を表示せよ.
演習1-1 (con’t) 追跡の例 int san_bai(int i){ return 3*i; } ↓ printf(“関数san_bai(%d)が開始.\n",i); int ret = 3*i; printf(“関数san_bai(%d)が終了.戻り値=%d",i,ret); return ret;
演習1-2 再帰を用いずに,n!(階乗)を求める関数を作成せよ. 引数に1~10を指定してmainから呼び出し,それぞれの戻り値を表示せよ.
演習2-0 再帰を用いて,nCr(組み合わせ)を求める関数を作成せよ. ヒント:答えは上から順に 10, 20, 35 引数にn=5,r=2を指定してmainから呼び出し,戻り値を表示せよ. 引数にn=6,r=3を指定してmainから呼び出し,戻り値を表示せよ. 引数にn=7,r=4を指定してmainから呼び出し,戻り値を表示せよ. ヒント:答えは上から順に 10, 20, 35
演習2-0 (con’t) ヒント 組み合わせ(Conbination) nCr は, r>1なら, nCr=n-1Cr-1 * n / r r==1なら, nCr=n
演習2-1 再帰を用いずに,nCr(組み合わせ)を求める関数を作成せよ. 引数にn=5,r=2を指定してmainから呼び出し,戻り値を表示せよ. 引数にn=6,r=3を指定してmainから呼び出し,戻り値を表示せよ. 引数にn=7,r=4を指定してmainから呼び出し,戻り値を表示せよ.
演習3-0 以下の様な数式anがある a0=0 an=an-1*an-1+1 (n>0) 再帰を用いて,anを求める関数を作成せよ. 引数に1~6を指定してmainから呼び出し,それぞれの戻り値を表示せよ. ヒント:a0=0, a1=1, a2=2, a3=5, a4=26, a5=677, a6=458330
演習3-1 以下の様な数式anがある(前スライドと同一) a0=0 an=an-1*an-1+1 (n>0) 引数に1~6を指定してmainから呼び出し,それぞれの戻り値を表示せよ.
演習4-0 再帰を用いて,フィボナッチ数列の第n項目を求める関数を作成せよ. 引数に0~9を指定してmainから呼び出し,それぞれの戻り値を表示せよ. フィボナッチ数列:1,1,2,3,5,8,13,21,... 第n+2項目=第n項目+第n+1項目 fibo(0)=1, fibo(1)=1,fibo(2)=2,…
演習4-1 再帰を用いて,フィボナッチ数列の第n項目を求める関数を作成せよ. 引数に6を指定してmainから呼び出し,その戻り値を表示せよ. 関数内にprintf()を入れ,動作を追跡せよ. 例:関数の1行目に”関数が開始されました.引数は??です.”と表示するprintfを配置する
演習4-2 再帰を用いて,フィボナッチ数列の第n項目を求めるプログラムを作成せよ. 引数に6を指定してmainから呼び出し,その戻り値を表示せよ. 関数呼び出しの関係(次スライド参照)を描写せよ 手書きで紙に描いて,写真を撮って提出 提出先ULRは口頭で指示 ファイル名は学籍番号.たとえば jx12345.jpg
演習4-2 (con’t) 「呼び出しの関係」の例 fibo(5) fibo(4) fibo(3) fibo(1) =1 fibo(2) fibo(3) fibo(2) fibo(1) =1 fibo(2) fibo(0) =1 fibo(1) =1 戻り値を書くと なお良い fibo(0) =1 fibo(1) =1 fibo(0) =1 fibo(1) =1
演習4-3 再帰を用いずに,フィボナッチ数列の第n項目を求める関数を作成せよ. 引数に0~9を指定してmainから呼び出し,それぞれの戻り値を表示せよ. フィボナッチ数列:1,1,2,3,5,8,13,21,... 第n+2項目=第n項目+第n+1項目
演習5 再帰を用いるフィボナッチ数列の関数と,用いない関数でどちらが短い時間で結果を求めることができるか調査し,調査結果を報告せよ. プログラムを開始してからの経過時間(クロック)は,clock()という関数で取得できる. clock()を用いて時刻取得を複数回行い,時刻の差を求めれば「かかった時間」をとめることができる.
演習5 (con’t) #include <stdio.h> #include <time.h> #include <stdlib.h> void main(){ clock_t ti[3]; ti[0] = clock(); printf("1回目時刻 %d\n", ti[0]); ti[1] = clock(); printf("2回目時刻 %d\n", ti[1]); ti[2] = clock(); printf("3回目時刻 %d\n", ti[2]); printf("1回目と2回目の時間差 %d\n", ti[1]-ti[0]); printf("1回目と3回目の時間差 %d\n", ti[2]-ti[0]); printf("size = %d\n", sizeof(clock_t)); } clockの使用の例: clock_t型は,(当面は)int型と理解して良い. 時間が余りに短いと,0になってしまうので注意 赤字のincludeを追加してください.
演習5 (con’t) #include <stdio.h> #include <time.h> #include <stdlib.h> void main(){ clock_t ti[2]; ti[0] = clock(); fibo(12); ti[1] = clock(); printf(“fibo(12)の時間= %d\n", ti[1]-ti[0]); }