JavaScript 作用域(递归)——参数值在没有显式声明的情况下被返回值覆盖

标签 javascript algorithm recursion

我对有序树遍历的第一个解决方案是利用递归函数调用的返回值:

BST.prototype.inOrder = function(node, array){
   if(!node){ return []; }
   if(!array){ array = []; }

   return this.inOrder(node.left).concat([node.val], this.inOrder(node.right))

}

但后来我看到它也可以用下面的代码解决,我对“数组”值是如何被持久化感到困惑的。

BST.prototype.inOrder = function(node, array){
  if(!node){ return []; }
  if(!array){ array = []; }
  this.inOrder(node.left, array);
  array.push(node.val);
  this.inOrder(node.right, array)
  return array
}

当第一个递归函数调用返回时,它是否覆盖了该函数范围内的数组值?为什么要这样做?

最佳答案

这是一个重载函数,在第一次调用时将在没有第二个参数的情况下调用,在这种情况下,变量会用一个空数组初始化。一个更好的写法可能是

BST.prototype.appendInOrder = function(node, array) {
  if (!node) return;
  this.appendInOrder(node.left, array);
  array.push(node.val);
  this.appendInOrder(node.right, array);
}
BST.prototype.inOrder = function(node) {
  var array = [];
  this.appendInOrder(node, array);
  return array;
}

关于JavaScript 作用域(递归)——参数值在没有显式声明的情况下被返回值覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44442592/

相关文章:

image - 如何结束动画? (加工)

algorithm - 是否可以将代码转换为逻辑图?

java - Jython JTable PrepareRenderer 运行时错误最大递归深度

c# - 从 C# 匿名对象获取属性

javascript - 如何按类搜索元素并在 Javascript 中检索标题属性(greasemonkey)

node.js - 为浏览器和 nodejs 环境提供简单实用程序的 JS 库?

javascript - 从外部异步函数发送快速响应

javascript - 单击任意位置即可关闭菜单

algorithm - 负载均衡算法——特例

javascript - 尝试从数组生成所有排列,但只得到一个小子集