Javascript 你如何避免“不”字;RangeError:超过最大调用堆栈大小;错误?

Javascript 你如何避免“不”字;RangeError:超过最大调用堆栈大小;错误?,javascript,recursion,Javascript,Recursion,我目前正在研究一种叫做递归除法的迷宫生成算法。算法很容易理解:步骤1:如果房间的高度小于宽度,用垂直线划分网格/房间。如果高度大于宽度,则用水平线分隔房间。步骤2:对管线创建的子腔室重复步骤1。您希望重复这些步骤,直到得到一个迷宫(直到宽度或高度等于1个单位) 这个算法的问题是JavaScript打印出一个RangeError,这意味着我调用了太多次创建迷宫的函数(我试图用递归函数实现这个算法)。有没有办法避免/防止这种情况发生?还是我的代码中遗漏了一些重要的东西,使算法无法正常工作 我曾尝试实

我目前正在研究一种叫做递归除法的迷宫生成算法。算法很容易理解:步骤1:如果房间的高度小于宽度,用垂直线划分网格/房间。如果高度大于宽度,则用水平线分隔房间。步骤2:对管线创建的子腔室重复步骤1。您希望重复这些步骤,直到得到一个迷宫(直到宽度或高度等于1个单位)

这个算法的问题是JavaScript打印出一个RangeError,这意味着我调用了太多次创建迷宫的函数(我试图用递归函数实现这个算法)。有没有办法避免/防止这种情况发生?还是我的代码中遗漏了一些重要的东西,使算法无法正常工作

我曾尝试实现蹦床功能,但由于我是一名初学者,我对它的理解还不足以实现我自己。我也曾三次错误地重新启动我的整个项目,希望我能想出一种不同的方法来解决这个问题,但每次我都会遇到同样的错误

我的代码在这里:

//leftCord = the left most x coordinate of my chamber/grid, upCord = the upmost y coordinate of my 
grid etc.

//(0, 0) IS POSITIONED IN THE LEFT TOP NODE OF MY GRID

function createMaze(leftCord, rightCord, upCord, downCord) {
var height = Math.abs(downCord - upCord);
var width = Math.abs(rightCord - leftCord);

if (height < 2 || width < 2) {
    //The maze is completed!
    return;
} else {

    if (height < width) {
        //cut the chamber/grid vertically

        //Getting a random number that's EVEN and drawing the function x = 'random number' on the grid
        var x = randomNum(leftCord / 2, rightCord / 2) * 2;

        var lineX = [];
        for (i = upCord; i < downCord; i++) {
            lineX.push(grid[i][x]);
        }

        //Making a random door/passage and making sure it's ODD
        var randomDoor = randomNum(0, lineX.length / 2) * 2 + 1;
        lineX.splice(randomDoor, 1);

        //Drawing the line
        for (i = 0; i < lineX.length; i++) {
            lineX[i].className = "wall";
        }

        //Making the same thing again, but with the left and right sub-chambers that were created by the line
        createMaze(leftCord, x, upCord, downCord);
        createMaze(x, rightCord, upCord, downCord);

    } else {
        //cut the chamber/grid horizontally

        //Getting a random number that's EVEN and drawing the function y = 'random number' on the grid
        var y = randomNum(0, downCord / 2) * 2;

        var lineY = [];
        for (i = leftCord; i < rightCord; i++) {
            lineY.push(grid[y][i]);
        }

        //Making a random door/passage and making sure it's ODD
        var randomDoor = randomNum(0, lineY.length / 2) * 2 + 1;
        lineY.splice(randomDoor, 1);

        //Drawing the line
        for(i = 0; i < lineY.length; i++){
            lineY[i].className = "wall";
        }

        //Making the same thing again, but with the upper and lower-chambers that were created by the line
        createMaze(leftCord, rightCord, upCord, y);
        createMaze(leftCord, rightCord, y, downCord);
    }




}
//leftCord=我的房间/网格最左边的x坐标,upCord=我的房间/网格最上面的y坐标
网格等。
//(0,0)位于我的网格的左上角节点中
功能createMaze(左线、右线、上行线、下行线){
var高度=数学绝对值(下行线-上行线);
变量宽度=数学绝对值(右线-左线);
如果(高度<2 | |宽度<2){
//迷宫完成了!
返回;
}否则{
if(高度<宽度){
//垂直切割腔室/格栅
//获取一个偶数的随机数,并在网格上绘制函数x='random number'
var x=随机数(左线/2,右线/2)*2;
var lineX=[];
用于(i=上行;i<下行;i++){
lineX.push(网格[i][x]);
}
//做一个随机的门/通道并确保它是奇怪的
var randomDoor=randomNum(0,lineX.length/2)*2+1;
lineX.拼接(随机门,1);
//划清界限
对于(i=0;i

}

之所以发生这种情况,是因为您从未使用
var
初始化
i
——它被发送到全局范围,并在每次函数调用时被覆盖。

我刚刚更新了代码,问题仍然存在。我在前面的代码中已经用“var”初始化了“I”,这意味着每次使用for循环时,我只需重置“I”的值。您最好为每个for循环的计数器定义一个新的var。不要对(i=0;i{只需对(var i=0;i{。这将消除由于
i
被限定在循环范围内而产生的副作用,并且不会保留
lineX的值。for循环完成后,length
。如果您不使用
var
部分,并且之前已经定义了
i
,这将导致先前定义的
i
具有vvalue
lineX.length
,这可能会导致不需要的结果。