Рекурсивные функции
Если в теле функции встречается вызов самой этой функции, то мы имеем дело с так называемой рекурсией. В языке программирования Pascal рекурсивностью могут обладать как функции, так и процедуры.
var a: integer;
procedure reverse(n: integer);
begin
write(n mod 10);
if (n div 10) <> 0 then
reverse(n div 10)
end;
begin
readln(a);
reverse(a);
writeln;
end.
Пример выполнения:
3096
6903
В приведенном примере процедура reverse выводит цифры, переданного ей в качестве фактического параметра числа, в обратном порядке. Т.е. если мы передаем число 35, то процедура выведет на экран число 53. Рассмотрим, как она это делает:
- Мы передаем число 3096.
- Процедура reverse выводит на экран остаток от деления на 10. Это число 6.
- Переход на новую строку не происходит, т.к. используется
write
. - Проверяется условие того, что 3096 при деление нацело на 10 больше нуля.
- Вызывается reverse с фактическим параметром, равным 309.
- Вторая запущенная процедура выводит на экран цифру 9 и запускает третью процедуру с параметром 30.
- Третья процедура выводит 0 и вызывает четвертый reverse с 3 в качестве параметра.
- Четвертая процедура выводит 3 на экран и ничего больше не вызывает, т.к. условие
(3 div 10) <> 0
ложно. - Четвертая процедура завершается и передает управление третьей.
- Третья процедура завершается и передает управление второй.
- Вторая процедура завершается и передает управление первой.
- Первая процедура завершается и передает управление в основную ветку программы.
В итоге, процедура reverse была вызвана четыре раза, хотя из основной программы к ней было единственное обращение.
Наличие условия в теле рекурсивной функции (или процедуры), при котором она больше себя не будет вызывать, очень важно. В противном случае, как и в ситуации с циклами, может произойти так называемое зацикливание.