応用情報技術者 2009年 春期 午前2 問07
問題文
文字列を引数とする関数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
エ:エラー
文字列比較関数 comp の動作解析【午前2 解説】
要点まとめ
- 結論:comp("11"、"101") の返り値は -1 です。
- 根拠:文字列の先頭文字のASCIIコードを比較し、"1"(49)と"1"(49)は等しいため再帰的に次の文字を比較し、次に "1"(49)と "0"(48)を比較して前者が大きいため -1 を返します。
- 差がつくポイント:文字列の長さだけでなく、先頭文字のASCIIコード比較の順序と再帰の流れを正確に理解することが重要です。
正解の理由
comp関数は文字列AとBを先頭から順に比較し、Aの先頭文字がBの先頭文字より小さい場合は1、大きい場合は-1を返します。
"11" と "101" の比較では、最初の文字は同じ "1" なので再帰的に次の文字を比較します。
次に "1"(Aの2文字目)と "0"(Bの2文字目)を比較すると、"1" のASCIIコードは49、"0" は48で、Aの文字の方が大きいため -1 を返します。
したがって正解は ア: -1 です。
"11" と "101" の比較では、最初の文字は同じ "1" なので再帰的に次の文字を比較します。
次に "1"(Aの2文字目)と "0"(Bの2文字目)を比較すると、"1" のASCIIコードは49、"0" は48で、Aの文字の方が大きいため -1 を返します。
したがって正解は ア: -1 です。
よくある誤解
- 文字列の長さだけで比較結果を判断しがちですが、先頭文字のASCIIコード比較が優先されます。
- 文字列の数字を数値として比較するのではなく、ASCIIコードの大小関係で判断する点を見落としやすいです。
解法ステップ
- comp("11"、"101") の先頭文字を比較する。
- first("11") = '1' (ASCII 49)、first("101") = '1' (ASCII 49) で等しいため再帰へ。
- butfirst("11") = "1"、butfirst("101") = "01" にして comp("1"、"01") を呼ぶ。
- first("1") = '1' (49)、first("01") = '0' (48) を比較。
- 49 > 48 なので comp は -1 を返す。
- これが最終結果となる。
選択肢別の誤答解説
- イ: 0
→ 文字列が完全に一致する場合のみ0を返すため、先頭文字が異なる時は0になりません。 - ウ: 1
→ Aの先頭文字がBより小さい場合に1を返しますが、今回の比較ではAの文字が大きいです。 - エ: エラー
→ 空文字列でない限りエラーは発生しません。今回の入力は空文字列ではありません。
補足コラム
この関数は文字列の辞書順比較に似ていますが、返り値の符号が一般的な比較関数とは逆の部分があります。
また、ASCIIコードで比較するため、数字の大小ではなく文字コードの大小を理解することが重要です。
再帰的に文字列を1文字ずつ比較する典型的なアルゴリズムの理解に役立ちます。
また、ASCIIコードで比較するため、数字の大小ではなく文字コードの大小を理解することが重要です。
再帰的に文字列を1文字ずつ比較する典型的なアルゴリズムの理解に役立ちます。
FAQ
Q: なぜ文字列の長さが違っても先頭文字の比較が優先されるのですか?
A: 文字列比較は辞書順で行うため、先頭文字の大小が結果を決定し、長さは最後の手段です。
A: 文字列比較は辞書順で行うため、先頭文字の大小が結果を決定し、長さは最後の手段です。
Q: 空文字列が引数の場合はどうなりますか?
A: 両方空文字列なら0、片方だけ空なら1または-1を返し、エラーは発生しません。
A: 両方空文字列なら0、片方だけ空なら1または-1を返し、エラーは発生しません。
関連キーワード: 文字列比較、再帰関数、ASCIIコード、辞書順、プログラミング基礎

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

