为什么这个递归函数给我一个“最大调用堆栈大小超过”错误
Why does this recursive function get me a "Maximum call stack size exceeded" error?
我正在用HTML画布创建一个绘画应用程序,我正在尝试实现一个"油漆桶"工具,该工具将检测任何与被点击的像素具有相同颜色的相邻像素,并使用新颜色填充它。
我得到一个"未捕获的RangeError:最大调用堆栈大小超过",但我不知道我的逻辑出了什么问题:
function fillTool(){
theCanvas.mousedown(function(e){
var baseColor = paintUtilities.getPixelColor(e.offsetX, e.offsetY);
context.fillStyle = color;
fillNeighbors(e.offsetX, e.offsetY, baseColor);
});
}
function fillNeighbors(x, y, baseColor) {
context.fillRect(x, y, 1, 1);
if (x > 0 && paintUtilities.getPixelColor(x - 1, y) === baseColor) {
fillNeighbors(x - 1, y, baseColor);
}
if (y > 0 && paintUtilities.getPixelColor(x, y - 1) === baseColor) {
fillNeighbors(x, y - 1, baseColor);
}
if (x < theCanvas.attr("width") - 1 && paintUtilities.getPixelColor(x + 1, y) === baseColor) {
fillNeighbors(x + 1, y, baseColor);
}
if (y < theCanvas.attr("height") - 1 && paintUtilities.getPixelColor(x, y + 1) === baseColor) {
fillNeighbors(x, y + 1, baseColor);
}
}
实际上在第二看,我看到你的代码的问题,它确实有无限递归!
假设从x = 1开始,x可以从0到2。首先向左,递归地调用函数。这个函数最终会向右移动!然后这个循环就会永远重复下去。你需要跟踪你访问过的地方,或者给递归函数传递一个不继续的方向,或者类似的东西。
因为它是一个递归函数,在每个if语句中你一次又一次地调用它…
相关文章:
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 超过了async.detect最大调用堆栈大小
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 超过了最大调用堆栈大小,循环无限
- 超过了最大调用堆栈大小.递归标签
- 日志:未捕获的范围错误:超过了最大调用堆栈大小
- 未捕获的范围错误:setTimeout()超过了最大调用堆栈大小
- JavaFX+WebView/Javascript:setTimeOut不起作用调用堆栈来自Java
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈
- jQuery捕获"RangeError:超过了最大调用堆栈大小“;
- 设置这个.RangeError:超过了最大调用堆栈大小
- 收到“范围错误: 超出最大调用堆栈大小”错误
- 递归 - 测试最大堆栈大小时,调用堆栈无法弹出
- 轮询 ajax 函数超出调用堆栈
- Chrome RangeError:使用jQuery$.map时超过了最大调用堆栈大小
- 要求JS 2.1.9引起“;最大调用堆栈"使用Grunt时出错
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 超过了最大调用堆栈大小-没有明显的递归
- 在 javascript 中使用函数堆栈调用非递归方法