Javaで再帰を反復に変えますか?
Nov 29 2020
再帰によって無限ループが発生するため、スタックオーバーフローエラーが発生します。メソッドを反復に変えるとこれは止まりますが、どうすればよいかわかりません。
誰かが私の再帰をループに変えるように私を導くことができますか?
private int findEmpty(int startPos, int stepNum, String key) {
if (arr[startPos] == null) {
return startPos;
}
return findEmpty(getNextLocation(startPos, ++stepNum, key), stepNum, key);
}
特にそれがreturn findEmpty(getNextLocation(startPos, ++stepNum, key), stepNum, key);
エラーの原因です!
回答
3 WillNess Nov 29 2020 at 23:09
再帰呼び出しはテール位置にあります。したがって、それはすでにループを記述しています。構文的に明示的にする必要があります。
private int findEmpty(int startPos, int stepNum, String key) {
while( True )
{
if (arr[startPos] == null) {
return startPos;
}
// return findEmpty(getNextLocation(startPos, ++stepNum, key), stepNum, key);
++stepNum;
int nextPos = getNextLocation(startPos, stepNum, key);
// return findEmpty(nextPos, stepNum, key);
startPos = nextPos;
}
}
私はJavaでコーディングしていません。上記のコードが何らかの形で準拠していない場合は、それを擬似コードと見なして、適切なものに変更してください。
LiveandLetLive Nov 29 2020 at 23:14
が完全arr[startPos]
でない場合、関数は決して戻りませんnull
。次のような条件を設定する必要があります。
private int findEmpty(int startPos, int stepNum, String key) {
if (startPos == arr.length) {
return -1; // The value if no null element is found
}
if (arr[startPos] == null) {
return startPos;
}
return findEmpty(getNextLocation(startPos, ++stepNum, key), stepNum, key);
}