JavaScript中的递归Floodfill错误-不会一直递归吗?

时间:2019-03-27 02:39:36

标签: javascript recursion flood-fill

我对使用Java脚本感到陌生,并尝试首次在其中编写Floodfill类型的算法(专门使用p5js库)。这是我第一次使用Java递归。

过去我已经在python中实现了Floodfill,并且效果很好。我认为我可以使用相同的代码,但可以更改语法,但对我而言不起作用。

它开始绕过障碍物填充,但随后停在中间,我不知道为什么

function generatePaths(board, row, col, depth=0){
    //print(board[row][col][1]);
    if ((row<0) || (row>100) || (col<0) || (col>100)){
        return;
    }
    if (board[row][col][0]!=0){
        return;
    }
    if (board[row][col][1]>0) {
        return;
    }
    if (board[row][col][0] == 0){
        board[row][col][0] = 2;
        board[row][col][1] = depth;
    }
    generatePaths(board, row+1,col, depth+1);
    generatePaths(board, row-1,col, depth+1);
    generatePaths(board, row,col-1, depth+1);
    generatePaths(board, row,col-1, depth+1);
}

我认为row和col变量可能是自我解释。第三个索引表示递归的值和深度。我本来没有深度值,但是我担心这可能是问题所在,所以我添加了它(它没有改变任何东西)

我想用2s替换所有空的board [row] [col] [0]值。如果当前那里为0,则它​​们为空。我不断遇到错误的地方是在第一次递归调用时

我可能犯了一个愚蠢的错误,但事实并非如此!我不明白该错误的原因,感谢您的帮助!

这是它在做什么的图片。我不知道为什么它只会停止。

enter image description here

1 个答案:

答案 0 :(得分:0)

使用 javascript 进行洪水填充算法时的主要问题是递归调用堆栈,它无法处理大型堆栈递归,这就是为什么需要将代码转换为使用堆来运行算法的循环和数组变体的原因。下面的链接将简要介绍堆变体背后的想法和逻辑。

flood-fill-algorithm-without-recursion