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

分野:アルゴリズムとプログラミング(データ構造・アルゴリズム・探索整列・計算量の実際・擬似言語・プログラム言語・データ記述言語)|実際に出題されたIPA過去問題

文字列を引数とする関数 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.  -1
  2.  0
  3.  1
  4.  エラー
解答・解説を見る

正解:ア

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文字ずつ比較し、同じなら残りの文字列で再帰」という辞書式比較に類似したロジックだと理解すると読みやすい。

出典:平成21年度 春期 応用情報技術者試験 午前 問7 / 独立行政法人情報処理推進機構(IPA)
※Web掲載用に表記を一部変更しています。著作権はIPAに帰属します。
📱 演習アプリで解く(無料・登録不要・2,640問収録)

「アルゴリズムとプログラミング」分野の攻略ポイント

データ構造・アルゴリズム・探索と整列・計算量・擬似言語・プログラム言語・データ記述言語が対象です。擬似言語のトレースは時間はかかるものの、落ち着いて表を書けば必ず正解にたどり着く「確実に取れる」問題です。

アルゴリズムとプログラミングの攻略ポイントをすべて見る(要点6項目・ひっかけ3項目)→

同じ分野(アルゴリズムとプログラミング(データ構造・アルゴリズム・探索整列・計算量の実際・擬似言語・プログラム言語・データ記述言語))の過去問