卡在无限递归中

Stuck in Infinite Recursion

本文关键字:递归 无限      更新时间:2023-10-16

我有这个函数来解决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 备忘单"。 您可以隔离它在循环中卡住的位置(如果您的猜测正确(,然后逐步完成。 您足够熟练地使用调试器来执行此操作所花费的总时间是,并且实际执行此操作所花费的时间少于您已经花费在思考它上的时间。

无意讽刺 - 人们确实经常高估学习调试器的工作,所以我想真正断言一点,即使是一个简单的问题也是值得的,并且对于大问题来说也是巨大的回报。