【发布时间】:2020-12-06 23:34:48
【问题描述】:
我有一个关于将变量初始化为全局变量和局部变量的问题。对于变量 sum 作为全局变量(输出:16)与 sum 作为辅助函数 dfs 中的局部变量(输出:10),我得到了不同的结果。它与递归性质有关吗?
我将总和计算为每个整数的总和乘以它在嵌套数组中的深度。
测试用例是[[1,1],2,[1,1]] 和的正确答案是 10。
为什么在这种情况下第一个方法,声明一个全局变量是错误的?最佳做法是什么?
//global variable
let sum = 0
function dfs(nestedList, depth){
for(let i=0; i<nestedList.length; i++){
if(nestedList[i].isInteger()) {
sum += nestedList[i].getInteger()*depth
}
else {
sum += dfs(nestedList[i].getList(),depth+1)
}
}
return sum
}
var depthSum = function(nestedList) {
console.log(sum)
return dfs(nestedList,1)
};
local variable
function dfs(nestedList, depth){
let sum = 0
for(let i=0; i<nestedList.length; i++){
if(nestedList[i].isInteger()) {
sum += nestedList[i].getInteger()*depth
}
else {
sum += dfs(nestedList[i].getList(),depth+1)
}
}
return sum
}
var depthSum = function(nestedList) {
console.log(sum)
return dfs(nestedList,1)
};
【问题讨论】:
-
如果变量是全局变量,它在整个程序中只存在一次。如果它是本地的,则每次调用
dfs都会存在一次。同样,当dfs调用自己时,内部“实例”每次都会看到一个全新的私有sum变量,只有他们自己可以访问。使用全局变量,您可以混合所有计算并添加一些东西两次。最佳做法始终本地化。 -
这两个版本都不应该工作。任何地方都没有
return声明。 -
每个函数的末尾是否应该有
return sum;? -
这取决于您实现的目标,还有局部变量控制台日志,因为您无法从外部访问总和值,所以它会以错误的方式传递给您,如果您看到一些值,则意味着您应该在全局中定义一些位置
-
Barmar 是对的,我错过了 dfs 函数中的 return 语句。感谢您建议保留变量本地 CherryDT!
标签: javascript arrays recursion nested global-variables