平成21年度春期 応用情報技術者試験 午前 問7
文字列を引数とする関数 len, first, butfirst を用いて,関数 comp を再帰的に定義した。comp("11", "101") を呼び出したとき,返されるものはどれか。 〔関数の定義〕 len(S):文字列 S の長さを返す。S が空文字列のときは 0 を返す。 first(S):文字列 S の先頭の 1 文字の ASCII コードを返す。S が空文字列のときはエラーを返す。 butfirst(S):文字列 S の先頭の 1 文字を除いた残りの文字列を返す。S が空文字列のときはエラーを返す。 comp(A, B) begin if len(A) = 0 and len(B) = 0 then return 0; if len(A) = 0 and len(B) ≠ 0 then return 1; if len(A) ≠ 0 and len(B) = 0 then return -1; if first(A) < first(B) then return 1; if first(A) > first(B) then return -1; return comp(butfirst(A), butfirst(B)); end
- ア -1
- イ 0
- ウ 1
- エ エラー
解答・解説を見る
正解:ア
AI解説
comp("11","101")は、先頭文字が共にASCIIコード'1'(同じ)なので再帰的にcomp("1","01")を呼び出す。ここでfirst("1")='1'(49)、first("01")='0'(48)となり、first(A)>first(B)なので-1を返す。 ア: -1が正しい。first(A)がfirst(B)より大きい場合に-1を返す規則により、この結果が導かれる。これが正解。 イ: 0はA,Bが共に空文字列になった場合の戻り値であり、本問はどちらの文字列も長さ1の非空文字列比較に至るため該当しない。 ウ: 1はfirst(A)<first(B)のときの戻り値であり、本問では逆にfirst(A)>first(B)であるため該当しない。 エ: エラーはlen(S)=0の文字列に対してfirst/butfirstを呼んだ場合に発生するが、本問の再帰呼出しはいずれも非空文字列に対して行われるため発生しない。 💡 再帰関数の追跡は「1文字ずつ比較し、同じなら残りの文字列で再帰」という辞書式比較に類似したロジックだと理解すると読みやすい。
※Web掲載用に表記を一部変更しています。著作権はIPAに帰属します。