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

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

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

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

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

〔プログラム〕

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条件判定(真)toBinary46
22条件判定(真) toBinary23
32条件判定(真)  toBinary11
42条件判定(真)   toBinary5

設問1

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

解答群

正解:ウ 5

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

設問2

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

解答群

正解:イ 5

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

設問3

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

解答群

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

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

本番形式

問 次の記述中の[ a ]に入れる正しい答えを,解答群の中から選べ。

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

関数 toBinary を toBinary(46) として呼び出したとき,プログラム中の α の行は[ a ]回実行される。

〔プログラム〕

○toBinary(整数型: n)
if (n ≧ 2)
toBinary(n ÷ 2 の商) /*** α ***/
endif
(n mod 2) を出力する

解答群

正解:エ 5

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

α の行は,下のトレース表(行番号つき)では 3 行目です。

解説

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

行番号つきのプログラム

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

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

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

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