IPA過去問ドリル

平成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

出典:平成21年度 春期 応用情報技術者試験 午前 問7

正解:ア

解説

comp("11","101")を評価すると,両文字列とも空でないため,先頭文字(ともに'1')を比較しますが等しいので,comp("1","01")を再帰的に呼び出します。ここでも両者は空でなく,先頭文字を比較すると'1'(ASCII49)は'0'(ASCII48)より大きいため,return -1が実行されます。

選択肢ごとの解説

  • 正しい。2回目の再帰呼出しでfirst("1")=49がfirst("01")=48より大きいため,-1が返されます。
  • 誤り。0が返るのは両文字列が空文字列になったときですが,この例では途中で大小比較により終了するため0にはなりません。
  • 誤り。1が返るのはfirst(A)がfirst(B)より小さい場合ですが,実際は'1'>'0'なので逆の結果になります。
  • 誤り。エラーになるのはlenが0の文字列に対してfirstやbutfirstを呼び出した場合ですが,この呼出し過程ではその状況は発生しません。
応用情報技術者の過去問を演習モードで解く