我正在学习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);
答案 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>