アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」
DESCRIPTION
アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. 戻り値が int 型の関数 fact. 仮引数 n. int 型 (32bit ). int fact ( int n ) { int fn; printf (“Call :fact(%d)\n”, n); if(n>0) fn=n* fact (n-1); else fn=1; printf (“ Return:fact (%d)==%d\ n”,n,fn ); - PowerPoint PPT PresentationTRANSCRIPT
アルゴリズムとデータ構造補足資料 3-2
「関数 fact の再帰呼出」
横浜国立大学理工学部
数物・電子情報系学科富井尚志
int fact(int n){ int fn;
printf(“Call :fact(%d)\n”, n);
if(n>0) fn=n*fact(n-1); else fn=1;
printf(“Return:fact(%d)==%d\n”,n,fn);
return fn;}
戻り値が int 型の関数 fact
int 型 (32bit)
仮引数 n
(自動)変数 fn
int 型 (32bit)
return
int 型 (32bit)
printf(“Call :fact(%d)\n”, n);
printf(“Return:fact(%d)==%d\n”,n,fn);
n>0 ?
fn=1; fn=n*fact(n-1);
yesno
戻り値が int 型の関数 main
void 型 (0bit)
仮引数 : なし
(自動)変数 k 3
int 型 (32bit)
printf(“fact(%d)=%d\n”, k, fact(k));
return
int 型 (32bit)
int main(void){ int k=3;
printf(“fact(%d)=%d\n”, k, fact(k));
return 0;}
戻り値が int 型の関数 main
void 型 (0bit)
仮引数 : なし
(自動)変数 k 3
int 型 (32bit)
printf(“fact(%d)=%d\n”, 3, fact(3));
return
int 型 (32bit)
int main(void){ int k=3;
printf(“fact(%d)=%d\n”, k, fact(k));
return 0;}
main から実行開始!
fact(3) を呼び出
し
fact(3)
fn
return
printf(“Call :fact(%d)\n”, n);
printf(“Return:fact(%d)==%d\n”,n,fn)
n>0 ?
fn=1; fn=n*fact(n-1);
yesno
n 3
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=1; fn=n*fact(n-1);
yesno
n 3
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(3-1);
yes
n 3
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, n);
printf(“Return:fact(%d)==%d\n”,n,fn)
n>0 ?
fn=1; fn=n*fact(n-1);
yesno
n 2
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=1; fn=2*fact(2-1);
yesno
n 2
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, n);
printf(“Return:fact(%d)==%d\n”,n,fn)
n>0 ?
fn=1; fn=n*fact(n-1);
yesno
n 1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1; fn=1*fact(1-1);
yesno
n 1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1*fact(0);
yes
n 1
fact(0)fact(0)
fn
return
printf(“Call :fact(%d)\n”, n);
printf(“Return:fact(%d)==%d\n”,n,fn)
n>0 ?
fn=1; fn=n*fact(n-1);
yesno
n 0
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1*fact(0);
yes
n 1
fact(0)fact(0)
fn
return
printf(“Call :fact(%d)\n”, 0);
printf(“Return:fact(%d)==%d\n”,n,fn)
0>0 ?
fn=1; fn=n*fact(n-1);
yesno
n 0
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1*fact(0);
yes
n 1
fact(0)fact(0)
fn 1
return
printf(“Call :fact(%d)\n”, 0);
printf(“Return:fact(%d)==%d\n”,n,fn)
0>0 ?
fn=1;
no
n 0
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1*fact(0);
yes
n 1
fact(0)fact(0)
fn 1
return
printf(“Call :fact(%d)\n”, 0);
printf(“Return:fact(%d)==%d\n”,0,1)
0>0 ?
fn=1;
no
n 0
1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1*fact(0);
yes
n 1
fact(0)
fn 1
return
printf(“Call :fact(%d)\n”, 0);
printf(“Return:fact(%d)==%d\n”,0,1)
0>0 ?
fn=1;
no
n 0
1fac
t(0)=
1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn=1* 1;
yes
n 1
fact(0)
fn 1
return
printf(“Call :fact(%d)\n”, 0);
printf(“Return:fact(%d)==%d\n”,0,1)
0>0 ?
fn=1;
no
n 0
1fac
t(0)=
1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn 1
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,n,fn)
1>0 ?
fn= 1;
yes
n 1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2
fact(1)
fact(1)
fn 1
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,1,1)
1>0 ?
fn= 1;
yes
n 1
1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2*fact(1);
yes
n 2fact(1)
fn 1
return
printf(“Call :fact(%d)\n”, 1);
printf(“Return:fact(%d)==%d\n”,1,1)
1>0 ?
fn= 1;
yes
n 1
1
fact(1)=1
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn 2
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,n,fn)
2>0 ?
fn=2;
yes
n 2
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3
fact(2)
fact(2)
fn 2
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,2,2)
2>0 ?
fn=2;
yes
n 2
2
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*fact(2);
yes
n 3 fact(2)
fn 2
return
printf(“Call :fact(%d)\n”, 2);
printf(“Return:fact(%d)==%d\n”,2,2)
2>0 ?
fn=2;
yes
n 2
2
fact(2)=2
fact(3)
fn
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=3*2;
yes
n 3
fact(3)
fn 6
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,n,fn)
3>0 ?
fn=6;
yes
n 3
fact(3)
fn 6
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,3,6)
3>0 ?
fn=6;
yes
n 3
6
fact(3)
fn 6
return
printf(“Call :fact(%d)\n”, 3);
printf(“Return:fact(%d)==%d\n”,3,6)
3>0 ?
fn=6;
yes
n 3
6
main 関数へfact(3)=6
戻り値が int 型の関数 main
void 型 (0bit)
仮引数 : なし
(自動)変数 k 3
int 型 (32bit)
printf(“fact(%d)=%d\n”, 3, fact(3));
return
int 型 (32bit)
int main(void){ int k=3;
printf(“fact(%d)=%d\n”, k, fact(k));
return 0;}
main 関数に戻る
fact(3) を呼び出
しfact 関数から
fact(3)=6
戻り値が int 型の関数 main
void 型 (0bit)
仮引数 : なし
(自動)変数 k 3
int 型 (32bit)
printf(“fact(%d)=%d\n”, 3, 6);
return
int 型 (32bit)
int main(void){ int k=3;
printf(“fact(%d)=%d\n”, k, fact(k));
return 0;} fact 関数から
fact(3)=6
main 関数に戻る
戻り値が int 型の関数 main
void 型 (0bit)
仮引数 : なし
(自動)変数 k 3
int 型 (32bit)
printf(“fact(%d)=%d\n”, 3, 6);
return 0
int 型 (32bit)
int main(void){ int k=3;
printf(“fact(%d)=%d\n”, k, fact(k));
return 0;}
正常終了