递归调用中的返回语句

时间:2019-09-01 12:09:34

标签: javascript algorithm recursion binary-search-tree

据我对递归调用的理解,是当您通过调用函数递归到该语句时,该语句必须是一个return语句,因为基本上当它从函数堆栈中弹出时,它希望从较早的调用中获得一些值

我有一些类似插入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)
        }
    }
}

即使我删除了呼叫的return语句(例如

),此方法也有效
else {
    if (root.right == null) {
        root.right = newNode
    } else {
        this.insertCorrectLocation(root.right, newNode)
    }
}

这是怎么发生的?

3 个答案:

答案 0 :(得分:5)

在递归函数中,仅当递归函数的外部消费者需要接收值时,才需要(明确)return,例如:

const foundNode = tree.findNode(5);

在这种情况下,由于您只插入一个值,而不检索一个值,因此不需要递归return

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

答案 1 :(得分:3)

不需要return来自函数的任何主要用于副作用的值。递归函数没有特殊处理,因此也适用。例如。 console.log主要用于效果,它返回默认值undefined。因此,在您的示例中,其中递归函数更改了一个现有对象,将在过程完成之后将根节点用作整个树。

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

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

  factorial(n - 1) * n;
}

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

未显式返回值的函数始终返回undefined。因此,对于阶乘返回undefined显然是一个错误,但是它确实使堆栈后退并进行了所有计算,只是它没有使用结果。

答案 2 :(得分:0)

我同意在递归函数中不需要显式返回的所有说法。

但是我目前正在研究一个巨大的递归函数,大约600行,带有许多if-else语句。我认为长时间递归函数不显式返回可能很危险。而且虽然我知道长函数具有其他问题,但是仅return;并没有什么坏处,特别是这就是意图。