public boolean isConnected(int row, int col) { //helper Method
int i;
int j;
if (BOARD[row][col].isEmpty())
return false;
for (i = row; i > 0; i--)
if (hasRed(i, col))
return true;
else if (isEmpty(i, col))
break;
for (i = row; i < ROWS; i++)
if (hasRed(i, col))
return true;
else if (isEmpty(i, col))
break;
for (i = col; i < COLS; i++)
if (hasRed(row, i))
return true;
else if (isEmpty(row, i))
break;
for (i = col; i > 0; i--)
if (hasRed(row, i))
return true;
else if (isEmpty(row, i))
break;
for (i = row, j = col; i > 0 && j < COLS; i--, j++)
if (hasRed(i, j))
return true;
else if (isEmpty(i, j))
break;
for (i = row, j = col; i < ROWS && j > 0; i++, j--)
if (hasRed(i, j))
return true;
else if (isEmpty(i, j))
break;
for (i = row, j = col; i > 0 && j > 0; i--, j--)
if (hasRed(i, j))
return true;
else if (isEmpty(i, j))
break;
for (i = row, j = col; i < ROWS && j < COLS; i++, j++)
if (hasRed(i, j))
return true;
else if (isEmpty(i, j))
break;
return false;
}
//真の解がある場合、多くのテストケースの後にアルゴリズムを終了しようとすると、例外が発生する可能性がありますが、再帰のステップが行うと思われる理由があります元の問題を単純化するのではなく、実際に問題を拡大します。正しい解決策を得るチャンスを得るために、問題は、確かに偽を返すべき特定の条件において、アルゴリズムが以前に解決されたサブ問題をチェックし続けるなどして終了できないということである。特殊なケースを修正するか、この場合stackoverflowエラーをキャッチしてください。
public boolean isConnected2(int rowCurr, int colCurr) {
if (rowCurr >= ROWS || rowCurr < 0 || colCurr < 0 || colCurr >= COLS)
return false; //Base case 1 reached bounds of the 2d array
if (isEmpty(rowCurr, colCurr))
return false;
if (isConnected(rowCurr, colCurr)) // base case 2 current piece is connected according to the method above
return true;
else {
return isConnected2(rowCurr + 1, colCurr + 1)
|| isConnected2(rowCurr - 1, colCurr - 1)
|| isConnected2(rowCurr + 1, colCurr - 1)
|| isConnected2(rowCurr - 1, colCurr + 1)
|| isConnected2(rowCurr - 1, colCurr - 1)
|| isConnected2(rowCurr + 1, colCurr)
|| isConnected2(rowCurr - 1, colCurr)
|| isConnected2(rowCurr, colCurr + 1)
|| isConnected2(rowCurr, colCurr - 1);
// if any of the above calls returns true we are done
}
}
事は、私は、アルゴリズムが無限に再帰を引き起こす特殊なケースを処理する方法がわからない、と私は真の解決策がある場合は、その原因(||)演算子の性質のために確信していますそれは終了します。この場合、単にStackOverFlowエラーを処理し、それをメソッドの偽の戻り値として扱うほうがよいでしょうか?
したがって、正しく終了する再帰関数を持つ代わりに、VMが爆発するのを頼りにしていますか? –
あなたは 'StackOverflowError'を扱うべきではありませんが、同じことを避けるために修正してください。 – asgs
一方、あなたは14の質問をし、1つの答えしか受け入れず、10ヶ月で2票しか投じませんでした。なぜあなたを助けなければならないのですか? –