卡在无限递归中
Stuck in Infinite Recursion
我有这个函数来解决C++中的迷宫,但是当我运行程序时,我在递归中出现错误访问错误。我认为这可能是一个无限循环。我不知道哪里出了什么问题。
bool Solve_Maze(int coorx,int coory) {
if((Map[coorx][coory]==Start)||(Map[coorx][coory]==path)) {
Map[coorx][coory]=wall;
Solve_Maze(coorx+1,coory);
Solve_Maze(coorx-1,coory);
Solve_Maze(coorx,coory+1);
Solve_Maze(coorx,coory-1);
}else if(Map[coorx][coory]==End) {
cout<<"You Solved the Maze!"<<endl;
delete Map;
return(true);
}
}
1(你没有在if语句
中返回任何值2(在所有函数调用中始终将map[coorx][coory]分配给墙。墙指的是全球状态吗?
我将函数更改为返回 void,因为该值未正确返回堆栈。在这种情况下,您只需使用全局 found 变量来检查是否找到了结束。(这将要求您每次在运行函数之前设置"found = false"(。
bool found = false;
您还想执行一些输入验证
if( coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return;
您需要将 maxX 和 maxY 替换为比 coorx 和 coory 的最大值多 1。这将确保您不会收到错误的访问错误。
bool found = false; // this will be global scope or pass it by reference
Solve_Maze(x,y);
// if(found) - found will be true if you found the end
void Solve_Maze(int coorx,int coory) {
if( coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return;
else if(((Map[coorx][coory]==Start)||(Map[coorx][coory]==path))) {
Map[coorx][coory]=wall;
Solve_Maze(coorx+1,coory);
Solve_Maze(coorx-1,coory);
Solve_Maze(coorx,coory+1);
Solve_Maze(coorx,coory-1);
}else if(Map[coorx][coory]==End) {
cout<<"You Solved the Maze!"<<endl;
delete Map;
found = true;
}
}
在调试器(gdb 或 dbx(中运行它。 使用 -g 标志进行编译,以便可以调试程序。 如果您不知道如何使用调试器,请谷歌"dbx 备忘单"。 您可以隔离它在循环中卡住的位置(如果您的猜测正确(,然后逐步完成。 您足够熟练地使用调试器来执行此操作所花费的总时间是,并且实际执行此操作所花费的时间少于您已经花费在思考它上的时间。
无意讽刺 - 人们确实经常高估学习调试器的工作,所以我想真正断言一点,即使是一个简单的问题也是值得的,并且对于大问题来说也是巨大的回报。
相关文章:
- 交换运算符 + 重载会导致无限递归
- 为什么当函数参数未定义为常量引用时存在无限递归?
- 递归应用 C++20 范围适配器会导致编译时无限循环
- 为什么这个递归函数会创建一个无限循环?
- 计算递归和时的无限循环
- 为什么这是无限递归
- C 递归函数无限循环
- 尝试"复制"shared_ptr向上转换行为会导致复制构造函数上的无限递归(导致段错误)
- ConstexPR模板功能的无限递归
- 交换和移动无限递归
- 无限循环与无限递归.两者都未定义吗?
- 函数中的无限递归
- 无限模板递归,因为没有布尔表达式优化,只有 gcc
- 运算符重载流提取运算符 (>>) C++会导致无限递归流提取
- C 无限环路:递归函数
- 实现递归函数,避免由 C++ 中 include 的循环调用(没有 #pragma 一次)引起的无限循环输入
- C :Ostream无限递归
- 无限递归模板实例化使用clang时GCC工作正常
- 当我使用 boost 构建绝对路径时,无限递归
- 模板中的无限递归