我对递归问题中的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;
}
}
答案 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
,则不会使用left
和right
的搜索结果,该函数将始终在末尾到达return null
将返回null,而不是正确的搜索结果。
答案 1 :(得分:0)
我认为我们已经将结果返回到外层。
否。
这实际上是return
的目的:做到这一点。如果您没有return
,则说明您没有这样做。
没有return关键字,它将基于节点数据返回“ null”或该节点。为什么我们需要再次在那上面退货?
在JavaScript中不正确。在其他一些编程语言中也可能如此。
除了在javascript中使用回调函数外,我们没有使用return
有时候我们这样做。这取决于您是否需要它们返回值。
所以,要回答:
为什么当我们需要返回一个值时,为什么需要递归“返回”?
因为这就是return
的名字,所以得名。