Javascript值为';在使用helper函数时传递t var IslandPermiture=功能(网格){ 设周长=0; 常数dfs=(网格、i、j、周长)=>{ 网格[i][j]=2; 如果(i==0 | |网格[i-1][j]==0)周长++; 如果(i==grid.length-1 | | grid[i+1][j]==0)周长++; 如果(j==0 | |网格[i][j-1]==0)周长++; 如果(j==grid[0]。长度-1 | | grid[i][j+1]==0)周长++; 如果(i>0&&grid[i-1][j]==1)dfs(grid,i-1,j,周长); 如果(i0&&grid[i][j-1]==1)dfs(grid,i,j-1,周长); 如果(j{ 网格[i][j]=2; 返回((i==0 | |网格[i-1][j]==0)?1:0)+ ((i==grid.length-1 | | grid[i+1][j]==0)?1:0)+ ((j==0 | |网格[i][j-1]==0)?1:0)+ ((j==grid[0]。长度-1 | | grid[i][j+1]==0)?1:0)+ ((i>0&&grid[i-1][j]==1)?dfs(grid,i-1,j):0)+ ((i0&&grid[i][j-1]==1)?dfs(grid,i,j-1):0)+ ((j

Javascript值为';在使用helper函数时传递t var IslandPermiture=功能(网格){ 设周长=0; 常数dfs=(网格、i、j、周长)=>{ 网格[i][j]=2; 如果(i==0 | |网格[i-1][j]==0)周长++; 如果(i==grid.length-1 | | grid[i+1][j]==0)周长++; 如果(j==0 | |网格[i][j-1]==0)周长++; 如果(j==grid[0]。长度-1 | | grid[i][j+1]==0)周长++; 如果(i>0&&grid[i-1][j]==1)dfs(grid,i-1,j,周长); 如果(i0&&grid[i][j-1]==1)dfs(grid,i,j-1,周长); 如果(j{ 网格[i][j]=2; 返回((i==0 | |网格[i-1][j]==0)?1:0)+ ((i==grid.length-1 | | grid[i+1][j]==0)?1:0)+ ((j==0 | |网格[i][j-1]==0)?1:0)+ ((j==grid[0]。长度-1 | | grid[i][j+1]==0)?1:0)+ ((i>0&&grid[i-1][j]==1)?dfs(grid,i-1,j):0)+ ((i0&&grid[i][j-1]==1)?dfs(grid,i,j-1):0)+ ((j,javascript,for-loop,recursion,reference,Javascript,For Loop,Recursion,Reference,如何修复它,以及在使用帮助函数时如何返回值以供将来参考 另外,我还有一个问题 在这个问题中,我们通过循环找到第一个岛,然后找到其余的岛。这是否意味着周界在一个dfs循环中得到响应,或者for循环将再次运行。。。ty正如其他人指出的,您需要从dfs签名中删除周长参数(请参见下面的代码) 这是因为您不能使用来自函数作用域之外的变量,这些变量与传递给函数的参数共享名称-在您的情况下,共享名称是permiture 最好不要将问题复杂化,但对于for循环,它将在第一次迭代中完成必要的计算,因为它是一种递

如何修复它,以及在使用帮助函数时如何返回值以供将来参考

另外,我还有一个问题


在这个问题中,我们通过循环找到第一个岛,然后找到其余的岛。这是否意味着周界在一个dfs循环中得到响应,或者for循环将再次运行。。。ty

正如其他人指出的,您需要从dfs签名中删除周长参数(请参见下面的代码)

这是因为您不能使用来自函数作用域之外的变量,这些变量与传递给函数的参数共享名称-在您的情况下,共享名称是permiture


最好不要将问题复杂化,但对于for循环,它将在第一次迭代中完成必要的计算,因为它是一种递归方法。我在下面为你调整了这个

需要注意的是,您还将在i for循环的第二次迭代之前返回,因此如果它不是递归方法,那么这将给您带来问题


var islandpermiture=函数(网格){
设周长=0;
常数dfs=(网格,i,j)=>{
网格[i][j]=2;
如果(i==0 | |网格[i-1][j]==0)周长++;
如果(i==grid.length-1 | | grid[i+1][j]==0)周长++;
如果(j==0 | |网格[i][j-1]==0)周长++;
如果(j==grid[0]。长度-1 | | grid[i][j+1]==0)周长++;
如果(i>0&&grid[i-1][j]==1)dfs(grid,i-1,j,周长);
如果(i0&&grid[i][j-1]==1)dfs(grid,i,j-1,周长);
如果(j控制台日志(ans)如注释中所述,对您的代码进行的最小更改将解决此问题,即将
周长
作为
参数
删除到
dfs

但我想提出一些改进建议。我们需要走几步才能到达我们想要去的地方

不要修改输入数据 第一个更改是在处理网格时不修改网格。处理不可变数据有各种各样的理由,特别是跨越函数边界。当然,这个算法本质上是关于修改网格,以便跟踪您已经访问过的位置。因此,我只需将原始调用中的数据副本传递给
dfs
函数:

dfs(grid.map(row=>row.slice(0)),i,j)
通过在网格上调用
map
,我们得到一个新的外部数组,其中包含对每一行的回调结果。通过对每一行调用
.slice(0)
,我们可以得到原始行的副本。这将为我们提供一个新的网格,其中包含与原始网格相同的数据。(请注意,这仍然是一个相对较浅的副本;如果栅格元素是对象而不是数字,则它们将通过引用共享。)

使用
return
而不是修改更高范围的变量 接下来,
dfs
正在更高范围内修改一个值,
周长
。这使得理解函数变得困难。相反,如果它返回该值,我们就可以以更容易理解的方式收集这些数据。这样我们就可以写作了

const dfs=(网格,i,j)=>{
网格[i][j]=2;
返回((i==0 | |网格[i-1][j]==0)?1:0)+
((i==grid.length-1 | | grid[i+1][j]==0)?1:0)+
((j==0 | |网格[i][j-1]==0)?1:0)+
((j==grid[0]。长度-1 | | grid[i][j+1]==0)?1:0)+
((i>0&&grid[i-1][j]==1)?dfs(grid,i-1,j):0)+
((i0&&grid[i][j-1]==1)?dfs(grid,i,j-1):0)+
((j
我们执行与以前相同的计算,但不是将结果添加到现有的外部范围变量,而是将它们添加在一起并返回它们。这意味着我们可以完全删除
periment
变量,只需将外部调用的结果返回到
dfs

if(网格[i][j]==1){
返回dfs(网格、i、j、周长);
}
计算辅助变量,而不是从循环中返回 但我发现,从不完整的
for
-循环返回的结果非常不令人满意。我宁愿计算r

var islandPerimeter = function(grid) {
   let perimeter = 0;

   const dfs = (grid, i, j, perimeter) => {
       grid[i][j] = 2;
       if( i === 0 || grid[i-1][j] === 0) perimeter++;
       if(i === grid.length - 1 || grid[i+1][j] === 0) perimeter++;
       if( j === 0 || grid[i][j-1] === 0) perimeter++;
       if(j === grid[0].length - 1 || grid[i][j+1] === 0) perimeter++;    
       
       if(i > 0 && grid[i-1][j] === 1) dfs(grid, i-1, j, perimeter);
       if(i < grid.length-1 && grid[i+1][j] === 1) dfs(grid, i+1, j, perimeter);
       if(j > 0 && grid[i][j-1] ===1) dfs(grid, i, j-1, perimeter);
       if(j < grid[0].length-1 && grid[i][j+1] === 1) dfs(grid, i, j+1, perimeter); 
       
   }
   
   let r = grid.length;
   let c = grid[0].length;
   
   for(let i = 0; i < r; i++) {
       for(let j = 0; j < c; j++) {
           if(grid[i][j] === 1) {
               dfs(grid, i, j, perimeter);
           }
       }
       return perimeter;
   }
};


const ans = islandPerimeter([
 [0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]
])