平成28年春期  午後問9

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
ぴーともさん  
(No.1)
平成28年春期  午後問9の問題を解いたのですがプログラムのC, Dに入る値が分かりません。解説もついていないのでどなたかご教授お願いします。
疑問としてはCの前のelse if文の条件は再帰的に自分の関数を呼び出していますが、これはd = 0になるまでelse if文で自分の関数を呼び出し続けませんか?
else if文の中に入る場合、またelseに入る場合がどのような場合が分かりません。
ソースコードを追っても分からないのでどなたかお願い致します。
2019.04.09 18:30
名無しさん 
(No.2)
exists_at(1,6,3)を例にトレースしてみます
本文のコードを簡易化してます

exists_at(1,6,3){
 if(exists_at(0,3,2) == 0){
  return 0;
 }else{
  return [ d ];
 }
}

exists_at(0,3,2){
 if(exists_at(0,1,1) == 0){
  return 0;
 }else{
  return [ d ];
 }
}

exists_at(0,1,1){
 if(exists_at(0,0,0) == 0){
  return 0;
 }else{
  return [ d ];
 }
}

exists_at(0,0,0) return 1;
つまりexists_at(0,0,0)は1です

最奥のreturnにつきました
ここから呼び出し元を辿っていきます

exists_at(0,1,1){
 if(1 == 0){ // exists_at(0,0,0)を1に置き換え
  return 0;
 }else{ // elseが実行される
  return [ d ]; // 引数(0,1,1)を当てはめるとreturn 1
 }
}

exists_at(0,3,2){
 if(1 == 0){ // exists_at(0,1,1)を1に置き換え
  return 0;
 }else{
  return [ d ]; // return 1
 }
}

exists_at(1,6,3){
 if(1 == 0){ // exists_at(0,3,2)を1に置き換え
  return 0;
 }else{
  return [ d ]; // return 1が最終的に返される
 }
}

2019.04.10 00:13
shooterさん 
(No.3)
c,dの答えは図2を見ればわかります。
if (exist_at(i / p_rn, j / p_cn, d - 1) == 0)
このif文は深さd-1のマスが空白の場合を表しているので、図2の下側の分岐に該当します。
下側の分岐では、深さdのマスが全て空白になっていますので、return 0; が答えとなります。

else以下は深さd-1のマスが*の場合を表しているので、図2の上側の分岐に該当します。
上側の分岐では、深さdのマスがパターン図形と一致していますので、
パターン図形を返す return pat[i % p_rn][j % p_cn]; が答えとなります。
2019.04.10 20:53
shooterさん 
(No.4)
補足として裏技のような解法となりますが、
ア、イ、カ以外の選択肢はi, j, dの値によって範囲外アクセスが発生するため、
正解ではないだろうという予測が立てられます。
2019.04.10 21:13

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop