【发布时间】:2019-06-27 03:25:47
【问题描述】:
我正在复习递归的概念并使用二叉树。我不明白在递归调用中使用 return 语句的实例与其他不使用 return 的实例之间的区别。我将给出说明我的问题的代码。
这是一个检查 BST 中是否存在值的函数:
public boolean containsNodeRecursive(Node current, int value) {
if (current == null) {
return false;
}
if (value == current.data) {
return true;
}
//HERE, THE RECURSIVE CALL IS PRECEDED BY A RETURN STATEMENT
return value < current.data
? containsNodeRecursive(current.left, value)
: containsNodeRecursive(current.right, value);
}
}
这是一个将数据插入 BST 的函数:
public Node insert(Node current, int data) {
if (current == null) {
return createNode(data);
} else if (data < current.data) {
//RECURSIVE CALL HERE WITHOUT USE OF A RETURN STATEMENT
current.left = insert(current.left, data);
} else if (data > current.data) {
current.right = insert(current.right, data);
}
return current;
}
我认为我的问题可以归结为:“我们什么时候应该返回递归调用,什么时候不应该?”
【问题讨论】:
-
“递归调用之前有一个return语句” - 不是真的,包含递归调用的语句仍然被评估以获得返回值
-
就像
return 1 + 2需要在返回之前计算加法的结果一样,return somefunction()需要计算函数调用的结果,不管递归有多深。如果你的递归不需要返回任何东西,你不一定需要返回任何东西——你只需要使用你的基本情况来终止递归。 -
简单的答案是:永远不会返回“递归调用”[!] - 你的例子都没有返回调用。(句点)另一方面,方法的返回值(!)是什么该方法应该“计算”。添加数字的方法可能会返回总和,所以这完全取决于您决定该方法应该做什么 - 没有一般规则。
-
在递归方面有两条规则:a) 尽量避免它。 b)如果你不能避免它,试着让它结束递归(return 是最后一个语句)。 [如果 b) 是可能的,编译器将尝试删除递归...]
-
@kai 尽量避免它,为什么?一些算法,比如这个算法,自然是递归的,最好用这种方式表达
标签: java recursion binary-search-tree