Javascript 递归调用中的return语句
从我对递归调用的理解来看,当您通过调用函数递归到中时,该语句需要是一个返回语句,因为基本上当它从函数堆栈中弹出时,它希望从前面的调用中得到一些值 我有一些类似于插入BST的代码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 {
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