【问题标题】:Maximum call stack size exceeded error during recursive calls递归调用期间超出最大调用堆栈大小错误
【发布时间】:2023-02-04 21:20:53
【问题描述】:

我一直在尝试解决一个递归问题islandPerimeter

/**
 * @param {number[][]} grid
 * @return {number}
 */
var islandPerimeter = function (grid) {
  let visitedLand = new Set();

  function dfs(i, j) {
    if (i < 0 || j < 0 || i > grid.length || j > grid[0].length || grid[i][j] == 0) return 0;
    if (visitedLand.has({ i: j })) return 1;

    visitedLand.add({ i: j });

    let perimeter = dfs(i, j + 1);
    perimeter += dfs(i + 1, j);
    perimeter += dfs(i, j - 1);
    perimeter += dfs(i - 1, j);

    return perimeter;
  }

  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      if (grid[i][j]) {
        return dfs(i, j);
      }
    }
  }
};

let nums = [
  [0, 1, 0, 0],
  [1, 1, 1, 0],
  [0, 1, 0, 0],
  [1, 1, 0, 0],
];
islandPerimeter(nums);

我已经在我的主要功能中初始化了dfs()的这个功能,但它显示了这个......

function dfs(i, j) {
              ^
RangeError: Maximum call stack size exceeded

有两个 for() 循环首先调用这个 dfs 函数,在其中我再次调用它们。 请解释这是什么问题,我已经阅读了一些关于过度调用递归的主题。有任何解决这个问题的方法吗?

【问题讨论】:

    标签: javascript multidimensional-array data-structures


    【解决方案1】:

    当表达式 {i: j} 在您的代码中出现两次时,它们是两个不同的对象。因此,Set 无法将第二个对象识别为与第一个对象相同:

    > visitedLand.has({1: 2})
    false
    > visitedLand.add({1: 2})
    Set(1) { { '1': 2 } }
    > visitedLand.has({1: 2})
    false
    

    因此,永远不会到达 return 1; 语句,递归将无限进行下去。

    使用字符串 i + "-" + j 而不是对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2021-07-24
      • 2011-08-31
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多