再帰で2進数を出力する|擬似言語のトレース解説と練習問題

レベル:中級 / タグ:再帰・if・出力・の商・mod

手続 toBinary は、1 以上の整数 n を受け取り、自分自身を呼び出しながら値を出力する。

プログラム

1○toBinary(整数型: n)
2 if (n ≧ 2)
3 toBinary(n ÷ 2 の商)
4 endif
5 (n mod 2) を出力する

何をしているか

n が 2 以上なら、先に n を 2 で割った商で自分自身を呼び出し、戻ってきてから n mod 2 を出力します。結果として、n の2進数表記が上の桁から順に出力されます。

トレースのコツ

  • まず、呼出しの引数を下向きに書き出します(例:13 → 6 → 3 → 1)。
  • 出力は、いちばん下(最後の呼出し)から上へ戻る順に起こります。
  • それぞれの呼出しで n は別の変数です。戻ってきたとき、n は呼び出す前の値のままです。

よくある間違い

  • 呼び出した順(上から)に出力すると考えてしまう。出力の行は再帰呼出しの後ろにあります。
  • 戻ってきたあとの n を、深い呼出しの値と取り違える。
  • n が 1 のときに出力されないと考える。if の外にあるので、必ず1回出力されます。

例題:toBinary(26) を最後まで追う

上のプログラムを toBinary(26) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したこと手続n
12条件判定(真)toBinary26
22条件判定(真) toBinary13
32条件判定(真)  toBinary6
42条件判定(真)   toBinary3
52条件判定(偽)    toBinary1
65出力(1)    toBinary1
73呼出し   toBinary3
85出力(1)   toBinary3
93呼出し  toBinary6
105出力(0)  toBinary6
113呼出し toBinary13
125出力(1) toBinary13
133呼出しtoBinary26
145出力(0)toBinary26

この例題で問われること

問 プログラムを実行したとき、出力される値はどれか(複数あるときは出力順)。

答え {1, 1, 0, 1, 0}

  • 出力された値は {1, 1, 0, 1, 0} です。

問 5行目を4回目に実行した直後の、変数 n の値はどれか。

答え 13

  • 5行目は全部で5回実行されます。
  • 実行した直後の n は、順に 1 → 3 → 6 → 13 → 26 です。
  • 4回目の直後なので、答えは 13 です。

問 3行目が実行される回数はどれか。

答え 4

  • 3行目は4回実行されます。トレース表で 3行目の行を数えると確かめられます。

練習問題 標準(5問)

本試験と同じくらいの量。レベル:中級

  1. 問題01 toBinary(29)
  2. 問題02 toBinary(47)
  3. 問題03 toBinary(12)
  4. 問題04 toBinary(46)
  5. 問題05 toBinary(25)
もっと解く(追加の10問)
  1. 問題06 toBinary(33)
  2. 問題07 toBinary(17)
  3. 問題08 toBinary(35)
  4. 問題09 toBinary(24)
  5. 問題10 toBinary(45)
  6. 問題11 toBinary(43)
  7. 問題12 toBinary(39)
  8. 問題13 toBinary(42)
  9. 問題14 toBinary(37)
  10. 問題15 toBinary(36)

ほかのアルゴリズム