[JS最大调用堆栈已超过P5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JS最大调用堆栈已超过P5相关的知识,希望对你有一定的参考价值。

我正在尝试编写程序以计算p5.js中最大的彩色连接块。问题是,当我递归调用框邻居时,它给出-“最大调用堆栈超出”,我知道错误的含义,但我不知道为什么会发生。这是我的代码:

class Box 
  constructor(id, x, y, w, h, col, colId) 
    this.id = id;
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.col = col;
    this.colId = colId;
  

  render() 
    fill(this.col);
    stroke(1);
    rect(this.x * this.w, this.y * this.w, this.w, this.h);
  

  getNeighbour(visited, x, y) 
    if(x - 1 < 0 || x + 1 >= rows || y - 1 < 0 || y + 1 >= cols) 
      return -1; 
    
    else 
      this.col = color(10,10,10);
      arr[x-1][y].getNeighbour(visited,x-1,y);
      arr[x+1][y].getNeighbour(visited,x+1,y);
      arr[x][y-1].getNeighbour(visited,x,y-1);
      arr[x][y+1].getNeighbour(visited,x,y+1);
    
    if(!this.contains(this.id)) 
      visited.push(this.id); 
    
    
    
    
  
  
  contains() 
    for(let i = 0; i < visited.length; i++) 
      if(this.id == visited[i]) return true; 
    
    return false;
  

请告诉我问题出在哪里。我也尝试过一次进行检查。首先是左邻居,就像魅力一样。但是当我添加正确的错误时也会出现此错误。我认为我已经满足了适当的默认情况,但实际情况可能有所不同。

答案

而不是:

else 
  this.col = color(10,10,10);
  arr[x-1][y].getNeighbour(visited,x-1,y);
  arr[x+1][y].getNeighbour(visited,x+1,y);
  arr[x][y-1].getNeighbour(visited,x,y-1);
  arr[x][y+1].getNeighbour(visited,x,y+1);

if(!this.contains(this.id)) 
  visited.push(this.id); 

尝试:

else if(!this.contains(this.id)) 
  visited.push(this.id);
  this.col = color(10,10,10);
  arr[x-1][y].getNeighbour(visited,x-1,y);
  arr[x+1][y].getNeighbour(visited,x+1,y);
  arr[x][y-1].getNeighbour(visited,x,y-1);
  arr[x][y+1].getNeighbour(visited,x,y+1);

进一步:我不确定this.contains是否正确,也许可以尝试:visited.contains...吗?

另一答案

[从框开始时,它递归到框的左,右,上方和下方。这四个盒子也一样。但是,如果您位于上方的方框中,并且调用了下方的方框,那么您将回到起点。这样反复进行,直到堆栈用尽。

根据您要执行的操作,一种简单的解决方案是将“包含”检查项拉出,如果之前曾访问过该框,则中止该操作:

getNeighbour(visited, x, y) 
    if( isOutsideBounds(x,y) || visited.indexOf(this.id) > -1) 
      return -1; 
    
    this.col = color(10,10,10);
    visited.push(this.id)
    arr[x-1][y].getNeighbour(visited,x-1,y);
    arr[x+1][y].getNeighbour(visited,x+1,y);
    arr[x][y-1].getNeighbour(visited,x,y-1);
    arr[x][y+1].getNeighbour(visited,x,y+1); 
  

同样,您的contains()函数似乎访问了visited数组,该数组不在函数的范围内。

另一答案

这是一种抽象方法。您可以带一个小岛柜台,计算每个小岛的物品。

function check(array) 

    function test(array, i, j, value) 
        if (array[i] && array[i][j] === -1) 
            count[value] = (count[value] || 0) + 1;
            array[i][j] = value;
            test(array, i - 1, j, value);
            test(array, i + 1, j, value);
            test(array, i, j - 1, value);
            test(array, i, j + 1, value);
            return true;
        
    
    
    var value = 1,
        count = ;

    array.forEach(a=> a.forEach((b, i, bb) => bb[i] = -b));
    array.forEach((a, i, aa) => a.forEach((b, j) => test(aa, i, j, value) && value++));
    array.map(a => console.log(...a));
    return count;


console.log(check([[1, 0, 1], [1, 0, 0], [1, 1, 1]]));
console.log(check([[1, 0, 1], [0, 1, 0], [1, 0, 1]]));
console.log(check([[1, 0, 0, 1, 1], [1, 1, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 1, 0, 1], [1, 1, 1, 0, 1]]));
.as-console-wrapper  max-height: 100% !important; top: 0; 

以上是关于[JS最大调用堆栈已超过P5的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬超过了Nodejs的最大调用堆栈大小

淘汰赛未捕获 RangeError:超过最大调用堆栈大小

RangeError:超过最大调用堆栈大小 React Native

Docker 容器的最大调用堆栈大小超过了 npm install

nodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小

Vue Apollo 上传文件崩溃节点最大调用堆栈大小超过 _openReadFs