首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归调用中的返回语句

递归调用中的返回语句
EN

Stack Overflow用户
提问于 2019-09-01 20:09:35
回答 3查看 344关注 0票数 2

根据我对递归调用的理解,当你通过调用函数来递归时,语句需要是一个返回语句,因为基本上当它弹出函数堆栈时,它会从前面的调用中获得一些值。

我有一些代码,如在BST中插入

代码语言:javascript
运行
复制
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)
        }
    }
}

即使我删除了调用的返回语句,这也是有效的,例如

代码语言:javascript
运行
复制
else {
    if (root.right == null) {
        root.right = newNode
    } else {
        this.insertCorrectLocation(root.right, newNode)
    }
}

这是怎么发生的呢?

EN

回答 3

Stack Overflow用户

发布于 2019-09-01 20:11:37

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

代码语言:javascript
运行
复制
const foundNode = tree.findNode(5);

在这种情况下,因为您只插入一个值,而不是检索一个值,所以不需要递归return

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

票数 7
EN

Stack Overflow用户

发布于 2019-09-01 22:44:49

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

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

代码语言:javascript
运行
复制
function factorial(n) {
  if (n === 1) return 1;

  factorial(n - 1) * n;
}

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

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

票数 4
EN

Stack Overflow用户

发布于 2020-07-21 11:34:52

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

但是我现在看到的是一个巨大的递归函数,大约有600行,有很多if-else语句。我认为对于长递归函数来说,没有显式返回的是很危险的。虽然我知道长递归函数还有其他问题,但只使用return;并不会有什么坏处,特别是这就是我们的意图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57745878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档