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]
])