平成23年度秋期 応用情報技術者試験 午前 問7
n個の正の整数x1,x2,…,xnが並んだ線形リストを[x1,x2,…,xn]で表し,空リストは[ ]で表す。次のように再帰的に定義される関数func(L)を,L=[1,3,2]を実引数として呼び出したとき,print文によって表示される数字はどれか。ここで,プログラム中の=は等号,:=は代入を表す。 〔関数の定義〕 (1) first([x1,x2,…,xn])はx1を返す。 (2) butfirst([x1,x2,…,xn])は[x2,…,xn]を返す。butfirst([x])は[ ]を返す。 (3) max(x,y)は,x≧yであればxを返し,そうでなければyを返す。 func(L) begin if L=[ ] then return 0; A:=first(L); B:=func(butfirst(L)); C:=max(A,B); print C; return C; end
- ア 123
- イ 133
- ウ 223
- エ 233
解答・解説を見る
正解:エ
AI解説
再帰呼出しを最深部から追う。func([])=0(printなし)。func([2])はA=2,B=0,C=max(2,0)=2を表示し2を返す。func([3,2])はA=3,B=2,C=max(3,2)=3を表示し3を返す。func([1,3,2])はA=1,B=3,C=max(1,3)=3を表示し3を返す。printは再帰の戻り(returnの直前)で実行されるため、表示順はリストの末尾側から2,3,3となり、エの233が正解である。 ア: 123は、printが再帰呼出しの前に先頭要素をそのまま表示すると誤解した場合の値である。 イ: 133は、途中のmax計算を誤った(2番目の表示を先頭要素1と末尾の比較と取り違えた)場合の値である。 ウ: 223は、表示順や最後のmax(1,3)の評価を誤った場合の値である。 エ: 正しい。再帰の最深部から順にC=2,3,3が表示されるため233となる。この関数は末尾からの最大値を順に表示している。 💡 再帰のトレースは「呼出しを深く潜ってから、戻りながら実行される処理(print)を拾う」のが鉄則。呼出しの木を書き、returnの値を下から埋めていくとミスしない。
※Web掲載用に表記を一部変更しています。著作権はIPAに帰属します。