陷入无限递归

时间:2012-05-19 05:19:23

标签: c++ recursion maze

我有这个函数来解决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);
    }
}

3 个答案:

答案 0 :(得分:2)

1)如果声明为
,您没有返回任何值 2)Map [coorx] [coory]总是在所有函数调用中分配到墙。墙是指全局状态吗?

答案 1 :(得分:2)

我将函数更改为返回void,因为该值未正确返回堆栈。在这种情况下,您只需使用全局找到变量来检查是否找到了结尾。 (这将要求您在运行函数之前每次都设置'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;
    }
}

答案 2 :(得分:0)

在调试器(gdb或dbx)中运行它。使用-g标志进行编译,以便调试程序。如果您不知道如何使用调试器,请谷歌“dbx cheatsheet”。您可以隔离它在循环中的位置(如果您的猜测是正确的)并逐步完成。你需要在调试器中熟练地完成这项工作的总时间,实际上要花费的时间少于你已经考虑过它的时间。

没有讽刺的意思 - 人们经常高估学习调试器的工作,所以我想要确定即使对于一个简单的问题它也是值得的,并且为大问题付出了巨大的回报。