HOME»基本情報技術者試験掲示板»平成31年春期午後問8
投稿する

平成31年春期午後問8 [3037]

 ascさん(No.1) 
https://www.fe-siken.com/kakomon/31_haru/pm08.html

説問3のeについて、

kの値は変わらないので行1~3の間を無限ループしてしまうと思うのですが、

なぜそうならないのでしょうか?
2021.03.07 20:21
メルルさん(No.2) 
設問3のeで言及されているプログラムは繰り返しではなく選択なのでループはしませんよ~
2021.03.07 20:37
サラダバーさん(No.3) 
問題文には「副プログラム Encode は,行番号2の条件が成リ立つとき,副プログラム Encode を再帰的に呼び出す」との記述があります。
つまり、求めたい文字に対応する葉を表す要素組の要素番号をkに与えてEncodeを実行すると、parent[k]が0以上である限り、副プログラムEncodeの中で更に副プログラムEncodeを呼び出し続けます。
昇順に整列がされていないのでデータ例としては正しくありませんが、図3を例に出してみます。
例えば、Dという文字のビット表現を求めたいとなったときにEncodeを実行すると、Dの要素番号は3なので、
要素番号3の親である4→要素番号4の親である5
とここまでまず行きます。しかしその先の、要素番号5の親である6はparentの値が-1なので、ここまでは遡らず、kの値は5でストップするというわけです。
詳しい説明をできなくて申し訳ありませんが、プログラムの中でプログラム自身を再帰的に呼び出しているということを念頭に置いて考えてみてください。
2021.03.07 20:39
 ascさん(No.4) 
メルルさん
選択ということは分かっています。繰り返しと勘違いしているわけではないのです。
2021.03.07 20:51
 ascさん(No.5) 
サラダバーさん
再帰的の意味を私が勘違いしている様な気がしますが、
仮にDだとして要素番号の3をKに引数として渡しますよね。
e=parent[k]>=0であり、今回kには3を渡しているので真となって3行目の処理を実行(encodeを再帰的に呼び出す。)
この時点で再帰的に呼び出したencodeの引数kには何を渡すのですか?
同じく3なんだと思っていたのですが、それだとループし続けちゃいますよね?
2021.03.07 21:01
メルルさん(No.6) 
そのkにparentの値を入れていって根まで到達すると再帰が終了します。
2021.03.07 21:07
 ascさん(No.7) 
メルルさん
k ← parent[k]というような処理はどこにもないと思うのですが、
再帰的に呼び出すとそうなるんでしょうか?
2021.03.07 21:17
ひとりものさん(No.8) 
Encodeを呼び出す部分が
Encode(parent[k], parent, left)となっているので,
呼び出したときに渡される引数の1つ目は「parent[k]」の値です。

そのparent[k]の値が改めてkに格納された状態で
Encodeのコードがもう一度先頭から実行される,と
考えてもらえばわかりやすいでしょうか。
Encodeのコードの冒頭に「(整数型:k …(以下省略)」とあるのはそういう意味です。

これは再帰だからというわけでなく,副プログラム(関数)であれば一般的にそうです。
2021.03.07 21:30
 ascさん(No.9) 
ひとりものさん

なるほど。分かりました。入力が確かにそうなってましたね。

ありがとうございます。
2021.03.07 22:22
 ascさん(No.10) 
皆様
お教えいただき、ありがとうございました。
2021.03.08 01:18
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop