Независимо от того, что вы делаете, вам придется раскручивать стек. Это оставляет два варианта:
- Магическое возвращаемое значение (как описано одним из Томов)
- Брось исключение (как упомянуто thaggie)
Если случай, когда вы хотите, чтобы вещи умирали, встречается редко, это может быть одна из тех ситуаций, когда выбрасывание исключения может быть жизнеспособным выбором. И прежде чем все начнут мне в этом горло, помните, что одно из самых важных правил программирования - знать, когда уместно нарушать правило.
Как оказалось, сегодня я потратил на оценку библиотеки zxing из кода Google. Они на самом деле используют исключения для многих управляющих структур. Мое первое впечатление, когда я увидел это был ужас. Они буквально вызывали методы десятки тысяч раз с разными параметрами, пока метод не выдает исключение.
Это, безусловно, выглядело как проблема с производительностью, поэтому я внес некоторые коррективы, чтобы изменить магическое возвращаемое значение. И знаешь, что? Код был на 40% быстрее при запуске в отладчике. Но когда я переключился на режим без отладки, код был менее чем на 1% быстрее.
Я до сих пор не в восторге от решения использовать исключения для управления потоком в этом случае (я имею в виду, исключения генерируются всего времени). Но, безусловно, не стоит тратить время на его повторную реализацию, учитывая почти неизмеримую разницу в производительности.
Если ваше условие, которое вызывает смерть итерации, не является фундаментальной частью алгоритма, использование исключения может сделать ваш код намного чище. Для меня, точка, в которой я бы принял это решение, заключается в том, что если вся рекурсия должна быть развернута, то я бы использовал исключение. Если нужно разматывать только часть рекурсии, используйте магическое возвращаемое значение.