根据我对递归调用的理解,当你通过调用函数来递归时,语句需要是一个返回语句,因为基本上当它弹出函数堆栈时,它会从前面的调用中获得一些值。
我有一些代码,如在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)
}
}
}即使我删除了调用的返回语句,这也是有效的,例如
else {
if (root.right == null) {
root.right = newNode
} else {
this.insertCorrectLocation(root.right, newNode)
}
}这是怎么发生的呢?
发布于 2019-09-01 20:11:37
在递归函数中,如果递归函数的外部使用者需要接收值,则只需(显式地)使用return:
const foundNode = tree.findNode(5);在这种情况下,因为您只插入一个值,而不是检索一个值,所以不需要递归return。
(如果没有return语句,函数将在到达其代码块的末尾时自动返回,并将控制传递回调用者)
发布于 2019-09-01 22:44:49
不需要从主要用于副作用的函数中return任何值。递归函数没有特殊的处理方法,所以它也适用于这些函数。例如:console.log主要用于effect,它返回默认值undefined。因此,在递归函数更改现有对象的示例中,在该过程完成后,该对象将能够使用根节点作为整个树。
最常见的错误是合同应该返回一个值,但您在某些地方忘记了返回。例如:
function factorial(n) {
if (n === 1) return 1;
factorial(n - 1) * n;
}
factorial(1) ; //==> 1
factorial(2) ; //==> undefined没有显式返回值的函数总是返回undefined。因此,对于阶乘,返回undefined显然是一个错误,但它确实倒回了堆栈并进行了所有计算,只是它没有使用结果。
发布于 2020-07-21 11:34:52
我同意所有关于递归函数中不需要显式返回的说法。
但是我现在看到的是一个巨大的递归函数,大约有600行,有很多if-else语句。我认为对于长递归函数来说,没有显式返回的是很危险的。虽然我知道长递归函数还有其他问题,但只使用return;并不会有什么坏处,特别是这就是我们的意图。
https://stackoverflow.com/questions/57745878
复制相似问题