迷路内のパスを見つけるために作成した関数に問題があります。そのパス上にある場合はtrueを返し、終了する場合はfalseを返します。迷路は解決できません。変数の " - 1s"をチェックしようとするとスタックオーバーフローエラーが発生しますが、ベースケースはそれを防止する必要があります。再帰でスタックスペースを少なくする方法はありますか?ここでは、必要なスタック領域の量が無限大であるとき、無限未満のものはまだ無限であるという単純な理由のために、「より少ないスタック領域」を使用することはできません私のコード再帰関数がスタックオーバーフローを引き起こしています
bool Pathfinder::check(string& maze, stack<string>& path, int x, int y, int z)
{int checking = 0;
if ((x == 4) && (y == 4) && (z == 4))
{
path.push(this->createCoords(x, y, z));
return true;
}
else
{
if ((x + 1) < 1 || (x + 1) > columns)
{
return false;
}
if ((y + 1) < 1 || (y + 1) > rows)
{
return false;
}
if ((z + 1) < 1 || (z + 1) > floors)
{
return false;
}
if ((x < 0) || (y < 0) || (z < 0))
{
return false;
}
if (this->getValue(maze, x, y, z) == 1)
{
this->setValue(maze, x, y, z, 2);
}
else
{
return false;
}
}
if (this->check(maze, path, x + 1, y, z) ||
this->check(maze, path, x, y + 1, z) ||
this->check(maze, path, x, y, z + 1))
{
checking++;
}
if (this->check(maze, path, x - 1, y, z) && checking == 1) //Overflow error comes from here
{
checking++;
}
if (this->check(maze, path, x, y - 1, z) && checking == 2)
{
checking++;
}
if (this->check(maze, path, x, y, z - 1) && checking == 3)
{
path.push(this->createCoords(x, y, z));
return true;
}
return false;
}
あなたの関数が再帰を止めることはありません。デバッガを使用してコードをトレースしたり、いくつかのログを追加して、実際に何が起こっているかを知っていましたか? –
これは問題ではありませんが、最初の5つの 'if'文は括弧が多すぎます。あなたは内側のものは必要ありません。 –
*再帰でスタックスペースを少なくする方法はありますか? - ここまでは、問題がスタックスペースであることを証明していません。あなたのコードのバグだけでなく、スタックのオーバーフローを引き起こしているあなたのロジックの間違いであれば、大きな迷路ではないでしょうか?また、これを使ってどのデータをテストしましたか?あなたがそうしていないなら、はるかに小さい迷路を使うことを勧めます。だから、バグだけではないことを確認してください。 – PaulMcKenzie