Ниже приведен только псевдокод.
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 в дереве.С помощью приведенного выше кода, если я верну правильное значение, оно будет всплывать по всей цепочке рекурсии, а затем, наконец, вернется.
Я предполагаю, что если я просто сгенерирую исключение вместо возврата true в строке 3, этона самом деле не будет всплывать через рекурсивную цепочку и напрямую возвращаться к вызывающей стороне.
Это хорошая практика - просто генерировать исключение, чтобы разорвать всю цепочку.Потому что, скажем, на line 4
, он нашел 42 в каком-то вложенном стеке, и все равно будет продолжать рекурсию на line 5
.Если я просто сгенерирую исключение на line 3
, мы сможем избежать этого ненужного вычисления.
Вопрос скорее о внутреннем компиляторе. Если я просто сгенерирую необработанное исключение, он все равно будет пузыриться до стека рекурсии (что делает этот подход бессмысленным) или напрямую вернется к счетчику программ родительского вызова.