HOME»基本情報技術者試験掲示板»平成28年春期 午後問9
投稿する
平成28年春期 午後問9 [1709]
ぴーともさん(No.1)
平成28年春期 午後問9の問題を解いたのですがプログラムのC, Dに入る値が分かりません。解説もついていないのでどなたかご教授お願いします。
疑問としてはCの前のelse if文の条件は再帰的に自分の関数を呼び出していますが、これはd = 0になるまでelse if文で自分の関数を呼び出し続けませんか?
else if文の中に入る場合、またelseに入る場合がどのような場合が分かりません。
ソースコードを追っても分からないのでどなたかお願い致します。
疑問としては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が最終的に返される
}
}
本文のコードを簡易化してます
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]; が答えとなります。
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の値によって範囲外アクセスが発生するため、
正解ではないだろうという予測が立てられます。
ア、イ、カ以外の選択肢はi, j, dの値によって範囲外アクセスが発生するため、
正解ではないだろうという予測が立てられます。
2019.04.10 21:13