Javascript 递归调用中的return语句

Javascript 递归调用中的return语句,javascript,algorithm,recursion,binary-search-tree,Javascript,Algorithm,Recursion,Binary Search Tree,从我对递归调用的理解来看,当您通过调用函数递归到中时,该语句需要是一个返回语句,因为基本上当它从函数堆栈中弹出时,它希望从前面的调用中得到一些值 我有一些类似于插入BST的代码 insertCorrectLocation(root, newNode) { if (newNode.data < root.data) { if (root.left == null) { root.left = newNode } else {

从我对递归调用的理解来看,当您通过调用函数递归到中时,该语句需要是一个返回语句,因为基本上当它从函数堆栈中弹出时,它希望从前面的调用中得到一些值

我有一些类似于插入BST的代码

insertCorrectLocation(root, newNode) {
    if (newNode.data < root.data) {
        if (root.left == null) {
            root.left = newNode
        } else {
            return this.insertCorrectLocation(root.left, newNode)
        }
    }
    else {
        if (root.right == null) {
            root.right = newNode
        } else {
            return this.insertCorrectLocation(root.right, newNode)
        }
    }
}

这是怎么发生的

在递归函数中,如果递归函数的外部使用者需要接收值,则只需(显式地)
返回
,例如:

const foundNode = tree.findNode(5);
在这种情况下,由于您只是插入一个值,而不是检索一个值,因此不需要递归
return
s


(如果没有
return
语句将控制权传递回调用者,函数到达其块的末尾时将自动返回)

不需要
从主要用于副作用的函数返回任何值。递归函数没有特殊的处理方法,所以它也适用于这些函数。例如,
console.log
主要用于生效,它返回默认值
undefined
。因此,在您的示例中,当递归函数改变现有对象时,将能够在过程完成后使用根节点作为整个树

最常见的错误是合同应该返回一个值,而您在某些地方忘记返回。例如

function factorial(n) {
  if (n === 1) return 1;

  factorial(n - 1) * n;
}

factorial(1) ; //==> 1
factorial(2) ; //==> undefined

不显式返回值的函数总是返回
未定义的
。因此,对于阶乘返回
未定义的
显然是一个错误,但它确实倒回了堆栈并完成了所有计算,只是没有使用结果

我同意所有关于递归函数不需要显式返回的说法


但我目前正在研究一个巨大的递归函数,大约600行,包含许多if-else语句。我认为长递归函数不显式返回是危险的。虽然我知道长递归函数还有其他问题,但只返回
并没有什么坏处,特别是这就是目的。

太好了。这也是我的问题。
function factorial(n) {
  if (n === 1) return 1;

  factorial(n - 1) * n;
}

factorial(1) ; //==> 1
factorial(2) ; //==> undefined