• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
30
0
0

読み込み中.... (全文を見る)

全文

(1)

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

「関数 fact の再帰呼出」

横浜国立大学 理工学部 数物・電子情報系学科

(2)

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 型 (32bit) 仮引数

n

(自動)変数 fn

int 型 (32bit)

return

printf(“Call :fact(%d)\n”, n);

printf(“Return:fact(%d)==%d\n”,n,fn);

n>0 ?

fn=1; fn=n*fact(n-1);

yes no

(3)

void 型 (0bit) 仮引数 : なし

(自動)変数

k 3

int 型 (32bit)

printf(“fact(%d)=%d\n”, k, fact(k));

return int main(void)

{

int k=3;

printf(“fact(%d)=%d\n”, k, fact(k));

return 0;

}

(4)

void 型 (0bit) 仮引数 : なし

(自動)変数

k 3

int 型 (32bit)

printf(“fact(%d)=%d\n”, 3, fact(3));

return int main(void)

{

int k=3;

printf(“fact(%d)=%d\n”, k, fact(k));

return 0;

}

main から実行開始!

fact(3) を 呼び出し

(5)

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);

no yes

n 3

(6)

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);

no yes

(7)

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

(8)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

fact(2)

fn

printf(“Call :fact(%d)\n”, n);

printf(“Return:fact(%d)==%d\n”,n,fn) n>0 ?

fn=1; fn=n*fact(n-1);

no yes

2

(9)

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

printf(“Call :fact(%d)\n”, 2);

printf(“Return:fact(%d)==%d\n”,n,fn) 2>0 ?

fn=1; fn=2*fact(2-1);

no yes

n 2

(10)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

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

2

fact(1)

fact(1)

fn

printf(“Call :fact(%d)\n”, n);

printf(“Return:fact(%d)==%d\n”,n,fn) n>0 ?

fn=1; fn=n*fact(n-1);

no yes

n 1

(11)

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

printf(“Call :fact(%d)\n”, 1);

printf(“Return:fact(%d)==%d\n”,n,fn) 1>0 ?

fn=1; fn=1*fact(1-1);

no yes

n 1

(12)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

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

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

t(0 fac

fact(0) )

fn

printf(“Call :fact(%d)\n”, n);

printf(“Return:fact(%d)==%d\n”,n,fn) n>0 ?

fn=1; fn=n*fact(n-1);

no yes

n 0

(13)

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

t(0 fac

fact(0) )

fn

printf(“Call :fact(%d)\n”, 0);

printf(“Return:fact(%d)==%d\n”,n,fn) 0>0 ?

fn=1; fn=n*fact(n-1);

no yes

n 0

(14)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

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

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

t(0 fac

fact(0) )

fn 1

printf(“Call :fact(%d)\n”, 0);

printf(“Return:fact(%d)==%d\n”,n,fn) 0>0 ?

fn=1;

no

n 0

(15)

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

t(0 fac

fact(0) )

fn 1

printf(“Call :fact(%d)\n”, 0);

printf(“Return:fact(%d)==%d\n”,0,1) 0>0 ?

fn=1;

no

n 0

(16)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

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

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

printf(“Call :fact(%d)\n”, 0);

printf(“Return:fact(%d)==%d\n”,0,1) 0>0 ?

fn=1;

no

n 0

fact(0)=1

(17)

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

printf(“Call :fact(%d)\n”, 0);

printf(“Return:fact(%d)==%d\n”,0,1) 0>0 ?

fn=1;

no

n 0

fact(0)=1

(18)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

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

2

fact(1)

fact(1)

fn 1

printf(“Call :fact(%d)\n”, 1);

printf(“Return:fact(%d)==%d\n”,n,fn) 1>0 ?

fn= 1;

yes

n 1

(19)

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

printf(“Call :fact(%d)\n”, 1);

printf(“Return:fact(%d)==%d\n”,1,1) 1>0 ?

fn= 1;

yes

n 1

(20)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

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

2

fact(1)

fn 1

printf(“Call :fact(%d)\n”, 1);

printf(“Return:fact(%d)==%d\n”,1,1) 1>0 ?

fn= 1;

yes

n 1

fact(1)=1

(21)

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

printf(“Call :fact(%d)\n”, 2);

printf(“Return:fact(%d)==%d\n”,n,fn) 2>0 ?

fn=2;

yes

n 2

(22)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*fact(2);

yes

fact(2)

fn 2

printf(“Call :fact(%d)\n”, 2);

printf(“Return:fact(%d)==%d\n”,2,2) 2>0 ?

fn=2;

yes

2

(23)

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

printf(“Call :fact(%d)\n”, 2);

printf(“Return:fact(%d)==%d\n”,2,2) 2>0 ?

fn=2;

yes

n 2

fact(2)=2

(24)

fn

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=3*2;

yes

(25)

fn 6

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,n,fn) 3>0 ?

fn=6;

yes

n 3

(26)

fn 6

return

printf(“Call :fact(%d)\n”, 3);

printf(“Return:fact(%d)==%d\n”,3,6) 3>0 ?

fn=6;

yes

6

(27)

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 関数へ

(28)

void 型 (0bit) 仮引数 : なし

(自動)変数

k 3

int 型 (32bit)

printf(“fact(%d)=%d\n”, 3, fact(3));

return int main(void)

{

int k=3;

printf(“fact(%d)=%d\n”, k, fact(k));

return 0;

}

main 関数に戻る

fact(3) を 呼び出し fact 関数から

fact(3)=6

(29)

void 型 (0bit) 仮引数 : なし

(自動)変数

k 3

int 型 (32bit)

printf(“fact(%d)=%d\n”, 3, 6);

return int main(void)

{

int k=3;

printf(“fact(%d)=%d\n”, k, fact(k));

return 0;

} fact 関数から

fact(3)=6 main 関数に戻る

(30)

void 型 (0bit) 仮引数 : なし

(自動)変数

k 3

int 型 (32bit)

printf(“fact(%d)=%d\n”, 3, 6);

return 0

int main(void) {

int k=3;

printf(“fact(%d)=%d\n”, k, fact(k));

return 0;

}

正常終了

参照

関連したドキュメント

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

⑤調査内容 2015年度 (2015年4月~2016年3月) 1年間の国内宿泊旅行(出張・帰省・修学旅行などを除く)の有無について.

(火力発電のCO 2 排出係数) - 調整後CO 2 排出係数 0.573 全電源のCO 2 排出係数

(火力発電のCO 2 排出係数) - 調整後CO 2 排出係数 0.521 全電源のCO 2 排出係数

添付資料-4-2 燃料取り出し用カバーの構造強度及び耐震性に関する説明書 ※3 添付資料-4-3

添付資料-4-2 燃料取り出し用カバーの構造強度及び耐震性に関する説明書 ※3 添付資料-4-3

添付資料-4-2 燃料取り出し用カバーの構造強度及び耐震性に関する説明書 ※3 添付資料-4-3