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

[1709] 平成28年春期  午後問9

 ぴーともさん(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日経過したスレッドへの書込みはできません。
© 2010-2024 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop