実体験から始める情報講座

基本情報技術者講座

★ 猫本 4-09 プログラムの属性(その3) ★

基本情報技術者 令和4年度6月免除 問7

2分木の各ノードがもつ記号を出力する再帰的なプログラムProc(n)の定義は,次のとおりである。このプログラムを,図の2分木の根(最上位のノード)に適用したときの出力はどれか。

Proc(n){

 nに左の子lがあればProc(l)を呼び出す。

 nに右の子rがあればProc(r)を呼び出す。

 nの記号を出力して終了する。

}

ア  +a*-bcd
イ  a+b-c*d
ウ  abc-d*+
エ  b-c*d+a

解説

(頭の準備体操)

再帰的:「手続の内部から自分自身を呼び出すことができる。」(FE27.1.07)


(イメージで解く)


①Proc(+)

+に,左の子aがあるので,Proc(a)を呼び出す。


②Proc(a)

aに,左の子,右の子がないので,aを出力して,Proc(+)に戻る。


③Proc(+),左の子の処理は終了済み

+に,右の子*があるので,Proc(*)を呼び出す。


④Proc(*)

*に,左の子-があるので,Proc(-)を呼び出す。


⑤Proc(-)

-に,左の子bがあるので,Proc(b)を呼び出す。


⑥Proc(b)

bに,左の子,右の子がないので,bを出力して。Proc(-)に戻る。


⑦Proc(-),左の子の処理は終了済み

-に,右の子cがあるので,Proc(c)を呼び出す。


⑧Proc(c)

cに,左の子,右の子がないので,cを出力して,Proc(-)に戻る。


⑨Proc(-),左の子,右の子の処理が終了済み

-を出力して,Proc(*)に戻る。


⑩Proc(*),左の子の処理は終了済み

*に,右の子dがあるので,Proc(d)を呼び出す。


⑪Proc(d)

dに,左の子,右の子がないので,dを出力して,Proc(*)に戻る。


⑫Proc(*),左の子,右の子の処理が終了済み

*を出力して,Proc(+)に戻る。


⑬Proc(+),左の子,右の子の処理が終了済み

+を出力して終了する。


よって,ウである。

解答