アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

30
アアアアアアアアアアアア アアアア 3-2 アア fact アアアアアアアアアアア アアアア アア アアアアアアア アアアア

Upload: geoffrey-kirkland

Post on 03-Jan-2016

56 views

Category:

Documents


4 download

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 Presentation

TRANSCRIPT

Page 1: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

アルゴリズムとデータ構造補足資料 3-2

「関数 fact の再帰呼出」

横浜国立大学理工学部

数物・電子情報系学科富井尚志

Page 2: アルゴリズムとデータ構造 補足資料 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

Page 3: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

戻り値が 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;}

Page 4: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

戻り値が 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) を呼び出

Page 5: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 6: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 7: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 8: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 9: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 10: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 11: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 12: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 13: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 14: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 15: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 16: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 17: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 18: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 19: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 20: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 21: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 22: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 23: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 24: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 25: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 26: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 27: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

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

Page 28: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

戻り値が 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

Page 29: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

戻り値が 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 関数に戻る

Page 30: アルゴリズムとデータ構造 補足資料 3-2 「関数 fact の再帰呼出」

戻り値が 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;}

正常終了