При рекурсии метод решает небольшую часть задачи, разбивает задачу на меньшие порции и вызывает сам себя для решения каждой из этих порций. Обычно рекурсию применяют, когда небольшую часть задачи легко решить, а саму задачу просто разложить на составные части.
Советы по использованию рекурсии
Убедитесь, что рекурсия остановится
Предотвращайте бесконечную рекурсию с помощью счетчиков безопасности
Ограничьте рекурсию одним методом
Следите за стеком
Не используйте рекурсию для факториалов и чисел Фибоначчи Рекурсия — мощный инструмент, и очень глупо использовать ее в этих двух случаях.
Вот рекурсивная версия вычисления факториала:
int Factorial( int number ) {
if ( number == 1 ) {
return 1;
}
else {
return number * Factorial( number - 1 );
}
}
Не считая медленного выполнения и непредсказуемого использования памяти, рекурсивный вариант функции трудней для понимания, чем итеративный вариант:
int Factorial( int number ) {
int intermediateResult = 1;
for ( int factor = 2; factor <= number; factor++ ) {
intermediateResult = intermediateResult * factor;
}
return intermediateResult;
}
Из этого примера можно усвоить три урока.
- Первый: учебники по ВычТеху не оказывают миру услугу своими примерами рекурсии.
- Второй, и более важный: рекурсия — гораздо более мощный инструмент, чем можно предположить из сбивающих с толку примеров расчета факториала и чисел Фибоначчи.
- Третий — самый важный: вы должны рассмотреть альтернативные варианты перед использованием рекурсии. Иногда один способ работает лучше, иногда — другой. Но прежде чем выбрать какой-то один, надо рассмотреть оба.
|