再帰で2進数を出力する 問題06

標準 レベル:中級 / このアルゴリズムの解説を読む

練習モードは行番号つきで順に解く形式、本番形式は公開問題と同じ体裁の1問です。

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

次のプログラムを toBinary(33) で呼び出す。

〔プログラム〕

1○toBinary(整数型: n)
2 if (n ≧ 2)
3 toBinary(n ÷ 2 の商)
4 endif
5 (n mod 2) を出力する
ヒント1:トレース表の枠を見る

この列で表を作り、文を1つ実行するたびに1行足していきます。

#行したことn
ヒント2:最初の4ステップを見る

続きを同じ要領で書いていきます。太字は、その文で値が変わった変数です。

#行したこと手続n
12条件判定(真)toBinary33
22条件判定(真) toBinary16
32条件判定(真)  toBinary8
42条件判定(真)   toBinary4

設問1

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

解答群

正解:イ 8

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

設問2

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

解答群

正解:イ 5

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

設問3

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

解答群

正解:イ {1, 0, 0, 0, 0, 1}

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

本番形式

問 次のプログラム中の[ a ]に入れる正しい答えを,解答群の中から選べ。

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

手続 toBinary を toBinary(33) として呼び出すと,1,0,0,0,0,1 の順に出力される。

〔プログラム〕

○toBinary(整数型: n)
if (n ≧ 2)
toBinary([ a ])
endif
(n mod 2) を出力する

解答群

正解:ア n ÷ 2 の商

  • それぞれの選択肢を空欄に入れて,実際に動かした結果は次のとおりです。
  • 「n ÷ 2 の商」→ 出力は 1、0、0、0、0、1(正解)
  • 「n - 1」→ 出力は 1、0、1、0、1、0、1、0 …(全部で33個)
  • 「n ÷ 2 の商 + 1」→ 繰返しが終わらない
  • 「n ÷ 2 の商 - 1」→ 出力は 0、0、0、1、1
  • 「n mod 2」→ 出力は 1、1
  • 「n - 2」→ 出力は 1、1、1、1、1、1、1、1 …(全部で17個)

解説

出力する行は再帰呼出しの後ろにあるので、いちばん深い呼出し(n が 1)から先に出力されます。 n を 2 で割った商を順に書き出し、下から n mod 2 を読むと、出力は {1, 0, 0, 0, 0, 1} です。33 の2進数表記と同じ並びになります。

行番号つきのプログラム

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

トレース表(全ステップ)

太字は、その文で値が変わった変数です。設問が指している行は黄色、その回は濃い黄色、変数は青い列で示します。

#行したこと手続n
12条件判定(真)toBinary33
22条件判定(真) toBinary16
32条件判定(真)  toBinary8
42条件判定(真)   toBinary4
52条件判定(真)    toBinary2
62条件判定(偽)     toBinary1
75出力(1)     toBinary1
83呼出し    toBinary2
95出力(0)    toBinary2
103呼出し   toBinary4
115出力(0)   toBinary4
123呼出し  toBinary8
135出力(0)  toBinary8
143呼出し toBinary16
155出力(0) toBinary16
163呼出しtoBinary33
175出力(1)toBinary33