- Рекурсия
- Работа
Рекурсия
Особый случай использования функции - это обращение к ней изнутри ее тела. Такой метод получил название рекурсивного вызова функции, или рекурсии.
Существует большое количество алгоритмов, которые чрезвычайно сложно реализуются обычным, нерекурсивным образом, в то время как с использованием рекурсии решение получается простым и красивым. Среди них, например, различные алгоритмы сортировки, поиска и т.п.
Рассмотрим пример рекурсивной функции для вычисления факториала числа:
long long factorial (unsigned char N){
long long result;
if (N != 0) result = N * factorial(N-1);
else result = 1;
return result;
}
Рекурсивный алгоритм подсчета факториала заключается в том, чтобы обращаться самому к себе, но со значением входного числа на 1 меньше текущего значения, пока входное значение не станет равно нулю. Возможно, это не самый удачный пример эффективного рекурсивного алгоритма, однако он хорошо раскрывает главную опасность рекурсии.
Рекурсивный алгоритм подсчета факториала заключается в том, чтобы обращаться самому к себе, но со значением входного числа на 1 меньше текущего значения, пока входное значение не станет равно нулю. Возможно, это не самый удачный пример эффективного рекурсивного алгоритма, однако он хорошо раскрывает главную опасность рекурсии.
Дело в том, что все локальные переменные размещаются в ОЗУ, причем при каждом новом обращении к функции происходит выделение для них новой области памяти. Чем «глубже» происходит погружение в рекурсивные вызовы, тем больше расходуется памяти. Это легко может привести к полному исчерпанию доступного пространства ОЗУ во время расчета, и узнать об этом будет чрезвычайно проблематично, ведь Си для микроконтроллеров не содержит никаких средств контроля подобных ситуаций.
Поэтому, не смотря на всю привлекательность рекурсивных алгоритмов, использовать их можно лишь с большой осторожностью.