HOME»基本情報技術者試験掲示板»基本情報Bサンプル問題の質問
投稿する
あちらのスレッドになぜか返信できなかったのでこちらで返信させていただきます。申し訳ございません。
自分の理解力が足りなかったため、納得することができませんでした。。。
この「nを出力」はなぜ値を出力するわけではなく、order()の引数に入るのでしょうか?
プログラムの「nを出力」は、実際にnという値を出力します。勘違いではないと思いますが。
めちゃめちゃわかりやすい説明ありがとうございます。
再帰関数的な感じになってるということですよね。
order(tree[n][1])の部分がわからなかったために、このようなミスをしてしまいました。
自分の理解力が乏しいあまりに、皆さんありがとうございました。
まだまだ勉強が足りないことが分かったので、これからも続けて、合格できるように頑張りたいと思います。
またわからないところがありましたらよろしくお願いします。
基本情報Bサンプル問題の質問 [4897]
しろうさん(No.1)
科目Bサンプル問題の問9の2分岐の問題です。
初歩的な質問かもしれませんが、優しい方回答してください。お願いします。
手続 order は,図の 2 分木の,引数で指定した節を根とする部分木をたどりなが
ら,全ての節番号を出力する。大域の配列 tree が図の 2 分木を表している。配列
tree の要素は,対応する節の子の節番号を,左の子,右の子の順に格納した配列で
ある。例えば,配列 tree の要素番号 1 の要素は,節番号 1 の子の節番号から成る配
列であり,左の子の節番号 2,右の子の節番号 3 を配列{2,3}として格納する。
○order(整数型: n)
if (tree[n]の要素数 が 2 と等しい)
order(tree[n][1])
nを出力
order(tree[n][2])
elseif (tree[n]の要素数 が 1 と等しい)
order(tree[n][1])
nを出力
else
nを出力
endif
このプログラムの「nを出力」でorder(n)になるとなっているのですが、自分は本当に出力しているのだと勘違いしてしまいました。
何度見てもorder(n)になる理由がわかりません。
どなたか教えてください。
初歩的な質問かもしれませんが、優しい方回答してください。お願いします。
手続 order は,図の 2 分木の,引数で指定した節を根とする部分木をたどりなが
ら,全ての節番号を出力する。大域の配列 tree が図の 2 分木を表している。配列
tree の要素は,対応する節の子の節番号を,左の子,右の子の順に格納した配列で
ある。例えば,配列 tree の要素番号 1 の要素は,節番号 1 の子の節番号から成る配
列であり,左の子の節番号 2,右の子の節番号 3 を配列{2,3}として格納する。
○order(整数型: n)
if (tree[n]の要素数 が 2 と等しい)
order(tree[n][1])
nを出力
order(tree[n][2])
elseif (tree[n]の要素数 が 1 と等しい)
order(tree[n][1])
nを出力
else
nを出力
endif
このプログラムの「nを出力」でorder(n)になるとなっているのですが、自分は本当に出力しているのだと勘違いしてしまいました。
何度見てもorder(n)になる理由がわかりません。
どなたか教えてください。
2023.06.12 04:58
boyonboyonさん(No.2)
★FE シルバーマイスター
しろうさん(No.3)
>boyonboyonさん
あちらのスレッドになぜか返信できなかったのでこちらで返信させていただきます。申し訳ございません。
自分の理解力が足りなかったため、納得することができませんでした。。。
この「nを出力」はなぜ値を出力するわけではなく、order()の引数に入るのでしょうか?
2023.06.12 09:57
まーぼさん(No.4)
★FE シルバーマイスター
最初のif文を通ったときを考えます。
if (tree[n]の要素数 が 2 と等しい)
1.order(tree[n][1])
2.nを出力
3.order(tree[n][2])
順次実行の性質から、1→2→3の順に実行されます。2を実行(nを出力)する前に1(order(tree[n][1])が実行されます。1の中にも数字を出力する部分があるので、いつもnが真っ先に出力されるわけではありません。
回答になっているか分かりませんが、これでどうでしょうか?
if (tree[n]の要素数 が 2 と等しい)
1.order(tree[n][1])
2.nを出力
3.order(tree[n][2])
順次実行の性質から、1→2→3の順に実行されます。2を実行(nを出力)する前に1(order(tree[n][1])が実行されます。1の中にも数字を出力する部分があるので、いつもnが真っ先に出力されるわけではありません。
回答になっているか分かりませんが、これでどうでしょうか?
2023.06.12 10:10
電タックさん(No.5)
★FE ブロンズマイスター
○order(整数型:n)処理の中で
前者「order(tree[n][1])もしくはorder(tree[n][2])を何故しているのか」
でしょうか?
後者「order(tree[n][1])もしくはorder(tree[n][2])はどういう意味か」
でしょうか?
上記どちらでもない場合、以降の記載は無視してください。
すみません・・・
前者は
「問題の処理として必要だから」という解答になってしまいます。
後者は
基本情報の用語で表現すると4つあるプログラム特性の内の、リカーシブに当たる処理方法で現在実行中の処理自体を再度実行するという方法になります。
※細かくはリエントラント・リユーザブルも
この場合再度実行するに辺り、現在実行中のものは処理行で一時停止の状態となり全く新しい処理として開始されます。言葉で表すと分かりにくいですが人間が行う事ほぼ全てがこれに当たると思います。
○勉強(教科)
数学を勉強している
> 時間になったので、英語の勉強を開始する
数学の勉強を一旦停止
< 英語の勉強時間が終わる
数学の勉強を再開
同じものを呼び出す事自体は意味がないように思われますが、そこで引数により変化が与えられているという処理になります。
リカーシブはプログラムの中でも階層が深くなるとイメージしにくいので、はじめのうちは混乱すると思います。
もう少しシンプルな記載もあるので、そういったもので理解を深めていくのが良いと思います。
https://www.fe-siken.com/kakomon/sample/b7.html
前者「order(tree[n][1])もしくはorder(tree[n][2])を何故しているのか」
でしょうか?
後者「order(tree[n][1])もしくはorder(tree[n][2])はどういう意味か」
でしょうか?
上記どちらでもない場合、以降の記載は無視してください。
すみません・・・
前者は
「問題の処理として必要だから」という解答になってしまいます。
後者は
基本情報の用語で表現すると4つあるプログラム特性の内の、リカーシブに当たる処理方法で現在実行中の処理自体を再度実行するという方法になります。
※細かくはリエントラント・リユーザブルも
この場合再度実行するに辺り、現在実行中のものは処理行で一時停止の状態となり全く新しい処理として開始されます。言葉で表すと分かりにくいですが人間が行う事ほぼ全てがこれに当たると思います。
○勉強(教科)
数学を勉強している
> 時間になったので、英語の勉強を開始する
数学の勉強を一旦停止
< 英語の勉強時間が終わる
数学の勉強を再開
同じものを呼び出す事自体は意味がないように思われますが、そこで引数により変化が与えられているという処理になります。
リカーシブはプログラムの中でも階層が深くなるとイメージしにくいので、はじめのうちは混乱すると思います。
もう少しシンプルな記載もあるので、そういったもので理解を深めていくのが良いと思います。
https://www.fe-siken.com/kakomon/sample/b7.html
2023.06.12 14:11
jjon-comさん(No.6)
★FE ゴールドマイスター
サンプル問題令和 [科目B]問9
https://www.fe-siken.com/kakomon/sample/b9.html
いいえ,本当にnの値を出力しています。
いいえ,本当にnの値を出力しています。
----
プログラム中の次の配列の
全要素14個を書き下してみると次のようになります。
「図 プログラムが扱う2分木」と対応していることを確認してください。
tree[1] = { 2, 3} //tree[1]の子の数は2
tree[2] = { 4, 5} //tree[2]の子の数は2
tree[3] = { 6, 7} //tree[3]の子の数は2
tree[4] = { 8, 9} //tree[4]の子の数は2
tree[5] = {10, 11} //tree[5]の子の数は2
tree[6] = {12, 13} //tree[6]の子の数は2
tree[7] = {14} //tree[7]の子の数は1
tree[8] = {} //tree[8]の子は無し
tree[9] = {} //tree[9]の子は無し
tree[10] = {} //tree[10]の子は無し
tree[11] = {} //tree[11]の子は無し
tree[12] = {} //tree[12]の子は無し
tree[13] = {} //tree[13]の子は無し
tree[14] = {} //tree[14]の子は無し
https://www.fe-siken.com/kakomon/sample/b9.html
> 「nを出力」…自分は本当に出力しているのだと勘違いしてしまいました。
いいえ,本当にnの値を出力しています。
> この「nを出力」はなぜ値を出力するわけではなく、
いいえ,本当にnの値を出力しています。
----
プログラム中の次の配列の
> 大域: 整数型配列の配列: tree ← {{2,3},{4,5},{6,7},{8,9},{10,11},{12,13},{14},{},{},{},{},{},{},{}}
全要素14個を書き下してみると次のようになります。
「図 プログラムが扱う2分木」と対応していることを確認してください。
tree[1] = { 2, 3} //tree[1]の子の数は2
tree[2] = { 4, 5} //tree[2]の子の数は2
tree[3] = { 6, 7} //tree[3]の子の数は2
tree[4] = { 8, 9} //tree[4]の子の数は2
tree[5] = {10, 11} //tree[5]の子の数は2
tree[6] = {12, 13} //tree[6]の子の数は2
tree[7] = {14} //tree[7]の子の数は1
tree[8] = {} //tree[8]の子は無し
tree[9] = {} //tree[9]の子は無し
tree[10] = {} //tree[10]の子は無し
tree[11] = {} //tree[11]の子は無し
tree[12] = {} //tree[12]の子は無し
tree[13] = {} //tree[13]の子は無し
tree[14] = {} //tree[14]の子は無し
2023.06.12 17:49
jjon-comさん(No.7)
★FE ゴールドマイスター
次に。
プログラム order() は if ... else if ... else ... endif によって3つの部分に分かれます。それぞれを別のプログラムとして記述すると次のようになります。
n = 1,2,3,4,5,6 の場合は(すなわち tree[n]の要素数が2と等しいなら)
order(n)を呼び出すと,次の3つの処理が順に呼び出されます。
〇order(n)
・まず先に order(nの左の子)を実行し
・その次に nを出力 を実行し
・その後に order(nの右の子)を実行する。
n = 7 の場合は(すなわち tree[n]の要素数が1と等しいなら)
order(n)を呼び出すと,次の2つの処理が順に呼び出されます。
〇order(n)
・まず先に order(nの左の子)を実行し
・その後に nを出力 を実行する。
n = 8,9,10,11,12,13,14 の場合は(tree[n]の要素数が2でも1でもないなら)
order(n)を呼び出すと,次の1つの処理だけを実行します。
〇order(n)
・nを出力 を実行する。
----
以上より。
order(1) を実行すると次のようになります。
〇order(1)
・まず先に order(2)を実行し
・その次に 1を出力 を実行し
・その後に order(3)を実行する。
要点は「1を出力」するより先に,order(2)が実行されるということ。
order(2)の実行がすべて終わらないと「1を出力」にならないということです。
order(2)の実行と order(3)の実行の箇所を展開すると次のようになります。
〇order(1)
〇order(2)
・まず先に order(4)を実行し
・その次に 2を出力 を実行し
・その後に order(5)を実行する。
・その次に 1を出力 を実行し
〇order(3)
・まず先に order(6)を実行し
・その次に 3を出力 を実行し
・その後に order(7)を実行する。
要点は「2を出力」するより先に,order(4)が実行されるということ。
order(4)の実行がすべて終わらないと「2を出力」にならないということ。
さらに,
order(5)の実行がすべて終わらないと「1を出力」にならない,
order(6)の実行がすべて終わらないと「3を出力」にならない,
ことが分かります。
----
order(4),order(5),order(6),order(7)の箇所を展開すると次のようになります。
〇order(1)
〇order(2)
〇order(4)
・まず先に order(8)を実行し
・その次に 4を出力 を実行し
・その後に order(9)を実行する。
・その次に 2を出力 を実行し
〇order(5)
・まず先に order(10)を実行し
・その次に 5を出力 を実行し
・その後に order(11)を実行する。
・その次に 1を出力 を実行し
〇order(3)
〇order(6)
・まず先に order(12)を実行し
・その次に 6を出力 を実行し
・その後に order(13)を実行する。
・その次に 3を出力 を実行し
〇order(7)
・まず先に order(14)を実行し
・その後に 7を出力 を実行する。
以上より,order(1)を呼び出した際の出力値の並びは,
【ウ】8,4,9,2,10,5,11,1,12,6,13,3,14,7 になります。
プログラム order() は if ... else if ... else ... endif によって3つの部分に分かれます。それぞれを別のプログラムとして記述すると次のようになります。
n = 1,2,3,4,5,6 の場合は(すなわち tree[n]の要素数が2と等しいなら)
order(n)を呼び出すと,次の3つの処理が順に呼び出されます。
〇order(n)
・まず先に order(nの左の子)を実行し
・その次に nを出力 を実行し
・その後に order(nの右の子)を実行する。
n = 7 の場合は(すなわち tree[n]の要素数が1と等しいなら)
order(n)を呼び出すと,次の2つの処理が順に呼び出されます。
〇order(n)
・まず先に order(nの左の子)を実行し
・その後に nを出力 を実行する。
n = 8,9,10,11,12,13,14 の場合は(tree[n]の要素数が2でも1でもないなら)
order(n)を呼び出すと,次の1つの処理だけを実行します。
〇order(n)
・nを出力 を実行する。
----
以上より。
order(1) を実行すると次のようになります。
〇order(1)
・まず先に order(2)を実行し
・その次に 1を出力 を実行し
・その後に order(3)を実行する。
要点は「1を出力」するより先に,order(2)が実行されるということ。
order(2)の実行がすべて終わらないと「1を出力」にならないということです。
order(2)の実行と order(3)の実行の箇所を展開すると次のようになります。
〇order(1)
〇order(2)
・まず先に order(4)を実行し
・その次に 2を出力 を実行し
・その後に order(5)を実行する。
・その次に 1を出力 を実行し
〇order(3)
・まず先に order(6)を実行し
・その次に 3を出力 を実行し
・その後に order(7)を実行する。
要点は「2を出力」するより先に,order(4)が実行されるということ。
order(4)の実行がすべて終わらないと「2を出力」にならないということ。
さらに,
order(5)の実行がすべて終わらないと「1を出力」にならない,
order(6)の実行がすべて終わらないと「3を出力」にならない,
ことが分かります。
----
order(4),order(5),order(6),order(7)の箇所を展開すると次のようになります。
〇order(1)
〇order(2)
〇order(4)
・まず先に order(8)を実行し
・その次に 4を出力 を実行し
・その後に order(9)を実行する。
・その次に 2を出力 を実行し
〇order(5)
・まず先に order(10)を実行し
・その次に 5を出力 を実行し
・その後に order(11)を実行する。
・その次に 1を出力 を実行し
〇order(3)
〇order(6)
・まず先に order(12)を実行し
・その次に 6を出力 を実行し
・その後に order(13)を実行する。
・その次に 3を出力 を実行し
〇order(7)
・まず先に order(14)を実行し
・その後に 7を出力 を実行する。
以上より,order(1)を呼び出した際の出力値の並びは,
【ウ】8,4,9,2,10,5,11,1,12,6,13,3,14,7 になります。
2023.06.12 17:50
boyonboyonさん(No.8)
★FE シルバーマイスター
>このプログラムの「nを出力」でorder(n)になるとなっているのですが、自分は本当に出力しているのだと勘違いしてしまいました。
>この「nを出力」はなぜ値を出力するわけではなく、order()の引数に入るのでしょうか?
プログラムの「nを出力」は、実際にnという値を出力します。勘違いではないと思いますが。
2023.06.12 18:06
しろうさん(No.9)
>>jjon-comさん
>>boyonboyonさん
>>電タックさん
めちゃめちゃわかりやすい説明ありがとうございます。
再帰関数的な感じになってるということですよね。
order(tree[n][1])の部分がわからなかったために、このようなミスをしてしまいました。
自分の理解力が乏しいあまりに、皆さんありがとうございました。
まだまだ勉強が足りないことが分かったので、これからも続けて、合格できるように頑張りたいと思います。
またわからないところがありましたらよろしくお願いします。
2023.06.13 00:56