为什么当我们需要返回一个值时,我们需要递归的“返回”?

时间:2019-01-20 17:46:32

标签: javascript algorithm recursion data-structures return

我对递归问题中的return关键字感到困惑。例如,以下代码与检查节点是否在二进制搜索树中有关。在contains方法中,我是否可以知道为什么需要

中的“返回”
return this.right.contains(data) 

return this.left.contains(data) 

? 我认为,没有此回报,只要我们致电

this.right.contains(data) 

没有return关键字,它将已经基于节点数据返回“ null”或该节点。为什么我们需要再次在那上面退货?

  if (this.data === data) {
        return this;
    }

  return null;

我认为我们已经将结果返回到外层。此外,当我们在javascript中使用回调函数时,我们没有使用return。我很困惑。非常感谢!

class Node {
 constructor(data) {
    this.data = data;
    this.left = null;
    this.right = null;
 }
 insert(data) {
    if (data < this.data && this.left) {
        this.left.insert(data);
    } else if (data < this.data) {
        this.left = new Node(data);
    } else if (data > this.data && this.right) {
        this.right.insert(data)
    } else if (data > this.data) {
        this.right = new Node(data);
    }
 }
 contains(data) {
    if (this.data === data) {
        return this;
    }
    if (this.data < data && this.right) {
        return this.right.contains(data)
    } else if (this.data > data && this.left) {
        return this.left.contains(data)
    }
    return null;

 }
}

2 个答案:

答案 0 :(得分:1)

我试图通过使您的代码更加冗长和文档化来阐明这一点。

contains(data) {
    if (this.data === data) {
        // This node has the data return this
        return this;
    }
    if (this.data < data && this.right) {
        // We need to search the right subtree
        // when the result is back we take it and put it in a variable
        const rightSubtreeSearchResult = this.right.contains(data);

        // we have the result, we just need to return it
        return rightSubtreeSearchResult;

    } else if (this.data > data && this.left) {
        // Same as above but for left subtree
        // this time we just return the result directly without
        // putting it in a variable. The resulting behavior is just as above
        return this.left.contains(data);

    }
    // None of the above return null
    return null;

}

您对this.right.contains(data)返回值是正确的,但是如果您仅调用该方法而不使用其返回值,则该值将一直未使用,直到函数执行完成然后消失为止。

简而言之,如果不进行return,则不会使用leftright的搜索结果,该函数将始终在末尾到达return null将返回null,而不是正确的搜索结果。

答案 1 :(得分:0)

  

我认为我们已经将结果返回到外层。

否。

这实际上是return的目的:做到这一点。如果您没有return,则说明您没有这样做。

  

没有return关键字,它将基于节点数据返回“ null”或该节点。为什么我们需要再次在那上面退货?

在JavaScript中不正确。在其他一些编程语言中也可能如此。

  

除了在javascript中使用回调函数外,我们没有使用return

有时候我们这样做。这取决于您是否需要它们返回值。

所以,要回答:

  

为什么当我们需要返回一个值时,为什么需要递归“返回”?

因为这就是return的名字,所以得名。