【发布时间】:2019-03-31 07:49:51
【问题描述】:
以下只是伪代码。
function x(node){
if(node.val == 42)
return true; // What if I throw an exception here ?
val1 = node.left ? x(node.left) : false ;
val2 = node.right ? x(node.right): false;
return val1 || val2 ;
}
假设我想在一棵树上找到 42。使用上面的代码,如果我返回一个有效值,它会冒泡到整个递归链,然后最终返回。
我的假设是,如果我只是抛出一个异常而不是在第 3 行返回 true,它实际上不会通过递归链冒泡并直接返回给调用者。
抛出异常来破坏整个链条是否是一种好习惯。因为假设在line 4,它确实在一些嵌套堆栈中找到了42,它仍然会在line 5 处进行递归。如果我只是在line 3 处抛出一个异常,我们可以避免这种不必要的计算。
问题更多的是编译器内部,如果我只是抛出一个未处理的异常,它是否仍然会冒泡到递归堆栈(这使得这种方法毫无意义)或直接返回到父调用的程序计数器。强>
【问题讨论】:
-
一个学生问我这个..这个问题让我感到不安。
-
如果您能描述为什么您认为这是一个好主意,那将会很有用。我看不出它有什么好处,所以很难知道从哪里开始。
-
应该使用异常来处理“异常”场景,因此用它们控制流程不是一个好主意。通常,可以使用更优雅的解决方案。你能发布一些代码来考虑吗?
-
每当出现这种情况时,这是我的首选资源:softwareengineering.stackexchange.com/a/189225。请注意,关于抛出的昂贵“位”是调用本机 fillInStackTrace(),因此如果您确实想像这样爆发,请尽量避免这种情况。
-
你为什么需要投掷?当你找到“一个有效的结果”时就返回,你永远不会递归太多。这就是重点:您通过与返回完全相同的堆栈推送次数返回
标签: java recursion tail-recursion