I 2010 0610 http www ns kogakuin ac

  • Slides: 34
Download presentation
プログラミング論 I 2010年 06月10日 関数の再帰呼び出し http: //www. ns. kogakuin. ac. jp/~ct 13140/Prog. 2009/ 1

プログラミング論 I 2010年 06月10日 関数の再帰呼び出し http: //www. ns. kogakuin. ac. jp/~ct 13140/Prog. 2009/ 1

関数の多段呼び出し 0/3 1 2 3 4 10 11 12 void func 0(){ printf("func 0

関数の多段呼び出し 0/3 1 2 3 4 10 11 12 void func 0(){ printf("func 0 start!n"); printf("func 0 end!n"); } void main(){ main() func 0(); } func 0() 実行結果 func 0() func 0 start! func 0 end! 4

関数の多段呼び出し 1/3 1 2 3 4 5 6 7 8 9 10 11 12

関数の多段呼び出し 1/3 1 2 3 4 5 6 7 8 9 10 11 12 void func 0(){ printf("func 0 } void func 1(){ printf("func 1 func 0(); printf("func 1 } void main(){ func 1(); } start!n"); end!n"); 実行結果 func 1 func 0 func 1 start! end! 5

1 2 3 4 5 6 7 8 9 10 11 12 13 14

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int kaijoh(int x){ int r; if( x == 1 ){ return 1; } else { r = x * kaijoh(x-1); return r; } } void main(){ int n, k; n = 5; k = kaijoh( n ); printf("%d! = %dn", n, k); } 再帰:nの階乗 2/5 12

main() 再帰:nの階乗 3/5 kaijoh(3)は,3*kaijoh(2)は,2*kaijoh(1)は,1 kaijoh(1)=1 kaijoh(2)=2 kaijoh(2)は,2*1 kaijoh(2)=2 kaijoh(3)は,3*2 kaijoh(3)=6 n==1の時は, これ以上再帰呼 び出ししない. これがないと

main() 再帰:nの階乗 3/5 kaijoh(3)は,3*kaijoh(2)は,2*kaijoh(1)は,1 kaijoh(1)=1 kaijoh(2)=2 kaijoh(2)は,2*1 kaijoh(2)=2 kaijoh(3)は,3*2 kaijoh(3)=6 n==1の時は, これ以上再帰呼 び出ししない. これがないと 無限に続く 13

再帰:nの階乗 4/5 kaijoh( 4 =4* kaijoh( 3 =4* (3* kaijoh( 2 =4* (3* (2*

再帰:nの階乗 4/5 kaijoh( 4 =4* kaijoh( 3 =4* (3* kaijoh( 2 =4* (3* (2* kaijoh(1) =4* (3* (2* 1 =4* (3* ( 2 =4* ( 6 =24 ) ) ) 14

失敗例 1 2 3 4 5 6 7 8 9 10 11 int kaijoh(int

失敗例 1 2 3 4 5 6 7 8 9 10 11 int kaijoh(int x){ int r; r = x * kaijoh(x-1); return r; } void main(){ int n, k; n = 5; k = kaijoh( n ); printf("%d! = %dn", n, k); } kaijoh(5)を呼び出し ↓ kaijoh(4)を呼び出し ↓ kaijoh(3)を呼び出し ↓ kaijoh(2)を呼び出し ↓ kaijoh(1)を呼び出し ↓ kaijoh(0)を呼び出し ↓ kaijoh(-1)を呼び出し ↓ kaijoh(-2)を呼び出し ↓ kaijoh(-3)を呼び出し ↓ 無限に続く 15

ハノイの塔を解く関数 1 2 3 4 5 6 7 8 9 10 11 12 13

ハノイの塔を解く関数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio. h> void hanoi(int n, int pl. From, int pl. To, int pl. Other){ if( n == 1 ){ printf("move disk. %d ", n); printf("[%d -> %d]n", pl. From, pl. To); } else { hanoi(n-1, pl. From, pl. Other, pl. To); printf("move disk. %d ", n); printf("[%d -> %d]n", pl. From, pl. To); hanoi(n-1, pl. Other, pl. To, pl. From); } } void main(){ hanoi(5, 0, 1, 2); } 29

フィボナッチ数列 fibo(5) fibo(4) fibo(3) fibo(2) fibo(1) =1 fibo(2) fibo(0) fibo(1) =1 =1 fibo(3) fibo(1)

フィボナッチ数列 fibo(5) fibo(4) fibo(3) fibo(2) fibo(1) =1 fibo(2) fibo(0) fibo(1) =1 =1 fibo(3) fibo(1) =1 fibo(2) fibo(0) fibo(1) =1 =1 f(2)計算などの, 同じ処理を何度も fibo(0) fibo(1) 行っている. =1 =1 大変に非効率的 31

解答 (い) #include <stdio. h> int fibo(int n){ if( n <= 1 ){ return

解答 (い) #include <stdio. h> int fibo(int n){ if( n <= 1 ){ return 1; } else { return fibo(n-1)+fibo(n-2); } } void main(){ printf("%dn", fibo(7)); } これは例 34