不同函数中的Javascript函数数组问题

问题描述

所以我正在用javascript自学数据结构,并正在尝试[Leetcode 200][1]。我想知道为什么如果我在这样的函数中有网格数组,它会起作用:

function numIslands(grid) {
  const H = grid.length;
  const W = H && grid[0].length;
  let count = 0;

  for (let r = 0; r < H; r++) {
    for (let c = 0; c < W; c++) {
       if (grid[r][c] === '0') continue;
  
       count++;
        dfs(r,c);
     }
   }
return count;

function dfs(r,c) {
   if (r < 0 || c < 0 || r === H || c === W) return;
   if (grid[r][c] === '0') return;

   grid[r][c] = '0';
   dfs(r-1,c);
   dfs(r+1,c);
   dfs(r,c-1);
   dfs(r,c+1);
  }
 }

但是,如果我创建一个辅助函数并像这样将网格数组传递给它,它不起作用并且我收到一个错误消息 Line 25 in solution.js if (grid[r][c] === '0') return; TypeError: Cannot read property '1' of undefined

function numIslands(grid) {
  const H = grid.length;
  const W = H && grid[0].length;
  let count = 0;

  for (let r = 0; r < H; r++) {
    for (let c = 0; c < W; c++) {
      if (grid[r][c] === '0') continue;

      count++;
      dfs(r,c,grid,H,W);
    }
  }
  return count;
}

function dfs(r,W) {
  if (r < 0 || c < 0 || r === H || c === W) return;
  if (grid[r][c] === '0') return;

  grid[r][c] = '0';
  dfs(r - 1,c);
  dfs(r + 1,c);
  dfs(r,c - 1);
  dfs(r,c + 1);
}  
}

是否与数组是如何通过引用或值传递有关,我对区别还是有点不清楚。谢谢! [1]:https://leetcode.com/problems/number-of-islands

解决方法

问题很可能是您在 grid 调用自身时没有传递 HWdfs

dfs(r - 1,c);
dfs(r + 1,c);
dfs(r,c - 1);
dfs(r,c + 1);

错误意味着 gridgrid[r]undefined。如果您没有为参数显式传递值,则该参数将设置为 undefined

你也必须在那里传递这些值:

dfs(r - 1,c,grid,H,W);
dfs(r + 1,W);
dfs(r,c - 1,c + 1,W);