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