递归函数(迷宫求解器) - 无法找到错误;(((

时间:2014-09-03 12:53:49

标签: javascript recursion maze

我正在学习javascript,除了像递归函数这样的东西之外,对我来说一切都很简单。我确实理解他们的工作方式,但在使用一个例子的时候,我意识到我无法捕捉阻止它运作的错误...

下面有一个数组(map)(0是一个闭合的单元格,1表示路径是打开的)和我试图使用的递归函数" find"走出这条"迷宫"从它的左上角单元格到右下角单元格。基本上只需要将函数设置为"找到"这条1s的路径。但它失败了;(

var map = [
        [1,1,0,0],
        [0,1,1,0],
        [0,0,1,0],
        [0,0,1,1]
    ]

function findpath(x,y) {
    if (x<0 || x>3 || y<0 || y>3) return false; //if it is outside of map
    if (x==3 && y==3) return true; // if it is the goal (exit point)
    if (map[y][x]==0) return false; //it is not open
    map[y][x]=9; //here marking x,y position as part of solution path outlined by "9"
    if (findpath(x,y-1) == true) return true;
    if (findpath(x+1,y) == true) return true;
    if (findpath(x,y+1) == true) return true;
    if (findpath(x-1,y) == true) return true;
    map[y][x]=8; //unmark x,y as part of solution path outlined by "8"
    return false;
    };
findpath(0,0);

2 个答案:

答案 0 :(得分:0)

“失败”的描述很少(如果有的话)是有用的错误报告。

为了让别人帮助你,他们需要更多细节。

在这种情况下,导入详细信息来自JavaScript错误控制台。您总是在您的问题中包含任何错误消息。

但是,由于您的代码很短,我可以将其剪切并粘贴到我收到消息的控制台中:

  

RangeError: Maximum call stack size exceeded

这意味着您的函数递归过深。你要么

  • 在你的谜题中有错误的逻辑并且你一遍又一遍地重复相同的值
  • 这个谜题太复杂了,你无法像那样递归地解决它。

您需要添加console.log语句并观察代码的作用,并了解它为何如此深入。

如果是逻辑错误,请修复逻辑错误。 (提示:我很确定它是 - 你从来没有在地图上标记过你已经 所以它可以在同一地点自由地来回移动。)

如果不是,那么你需要使用一些更高级的技巧来解决递归问题,例如使用生成器函数并分别存储你在地图中所做的更改。

答案 1 :(得分:0)

快速回答:

由于检查的顺序,它在循环中锁定。

从0:0开始,然后尝试0:1。然后从0:1 - “嗯... 0:0看起来很有希望。让我们去那里”。所以回到0:0 ......所以锁定...... 尝试最后离开回溯:

if(findpath(x+1,y)) return true;    
if(findpath(x,y+1)) return true;    
if(findpath(x,y-1)) return true;
if(findpath(x-1,y)) return true;

这只是通过交换问题让你摆脱锁定。如果你从3:3开始尝试达到0:0,你将再次被锁定。 什么是错过了标记受访广场的方法。

我认为您正在尝试实施a* algorithm

更新:

这是你的想法。刚刚添加了你几乎实现的回溯检查。

<html>
    <head>
    </head>
    <body>
        <script>
            var map = [
            [1,1,0,0],
            [0,1,1,0],
            [1,1,1,0],
            [1,0,1,1]
        ]

    var goalx = 0;
    var goaly = 3;

    console.log();

    function findpath(x,y) {


        // illegal move check
        if (x < 0 || x > (map[0].length -1) || y < 0 || y > (map.length - 1)) return false; //if it is outside of map
        if (map[y][x]==0) return false; //it is not open

        // end move check
        if (x== goalx && y== goaly){
            console.log('Reached goal at: ' + x + ':' + y);
            return true; // if it is the goal (exit point)
        }

        if(map[y][x] == 9 || map[y][x] == 8)
            return false;

        console.log('Im here at: ' + x + ':' + y);

        map[y][x]=9; //here marking x,y position as part of solution path outlined by "9"

        if(findpath(x+1,y)) 
            return true;    
        if(findpath(x,y+1)) 
            return true;    
        if(findpath(x,y-1))
            return true;
        if(findpath(x-1,y)) 
            return true;                    

        map[y][x]=8; //unmark x,y as part of solution path outlined by "8"

        return false;
    };

    findpath(3, 3);
        </script>
    </body>
</html>