我有一个整数的2D网格。用户可以选择任何位置并将其数量增加或减少一个。该算法应调整所有八个相邻位置,以使它们之间的差异不超过一个。
我大部分时间都在工作,但是必须有一个边缘情况,因为在做了一些调整后,其中一个位置可能会变得不稳定(远远超过一个)。
这是网格一旦变得不稳定的截图。
javascript,所以这是
var moveDown = function (x, y) {
var updated = false;
if (x-1 >= 0 && Math.abs(grid[x][y] - grid[x-1][y]) > 1) {
grid[x-1][y] -= 1;
updated = true;
}
if (x+1 < size && Math.abs(grid[x][y] - grid[x+1][y]) > 1) {
grid[x+1][y] -= 1;
updated = true;
}
if (y-1 >= 0 && Math.abs(grid[x][y] - grid[x][y-1]) > 1) {
grid[x][y-1] -= 1;
updated = true;
}
if (y+1 < size && Math.abs(grid[x][y] - grid[x][y+1]) > 1) {
grid[x][y+1] -= 1;
updated = true;
}
if (x-1 >= 0 && y-1 >= 0 && Math.abs(grid[x][y] - grid[x-1][y-1]) > 1) {
grid[x-1][y-1] -= 1;
updated = true;
}
if (x-1 >= 0 && y+1 < size && Math.abs(grid[x][y] - grid[x-1][y+1]) > 1) {
grid[x-1][y+1] -= 1;
updated = true;
}
if (x+1 < size && y-1 >= 0 && Math.abs(grid[x][y] - grid[x+1][y-1]) > 1) {
grid[x+1][y-1] -= 1;
updated = true;
}
if (x+1 < size && y+1 < size && Math.abs(grid[x][y] - grid[x+1][y+1]) > 1) {
grid[x+1][y+1] -= 1;
updated = true;
}
if (updated) {
if (x-1 >= 0) { moveDown(x-1, y); }
if (x+1 < size) { moveDown(x+1, y); }
if (y-1 >= 0) { moveDown(x, y-1); }
if (y+1 < size) { moveDown(x, y+1); }
if (x-1 >= 0 && y-1 >= 0) { moveDown(x-1, y-1); }
if (x-1 >= 0 && y+1 < size) { moveDown(x-1, y+1); }
if (x+1 < size && y-1 >= 0) { moveDown(x+1, y-1); }
if (x+1 < size && y+1 < size) { moveDown(x+1, y+1); }
}
}
我有一个小提琴here,我一直用它来玩。
如何解决问题以使其正常工作?
答案 0 :(得分:0)
正如评论中指出的那样,你的代码是递归的,在某些情况下它会遇到无限递归。
当触发无限递归时,结果取决于正在使用的Javascript引擎。在某些版本中,错误消息“未捕获的RangeError:超出最大调用堆栈大小”将出现在错误控制台中。 (对于Chrome来说就是这种情况。)其他Javascript引擎可能会以不同的方式处理它,并且可能采用不那么好的方式。
仅当Javascript引擎中断执行并仍然刷新页面呈现(不进一步执行代码)时,才会显示异常数值。
您可以使用for循环实现原始想法,而不使用递归。
您可以从Morphological Image Processing获得一些想法。