Модуль: Pascal. Подпрограммы. Рекурсия


1. Рекурсия. Что это?

☰ Теория

Процедура или функция может содержать внутри себя вызов другой процедуры. В том числе, подпрограмма может вызывать саму себя. В этом случае компьютеру все равно. Он также как и всегда последовательно сверху вниз выполняет те команды, которые ему встретились.

Если вспомнить математику, то там можно встретить принцип математической индукции. Он заключается в следующем:

Некоторое утверждение справедливо для всякого натурального n, если
    1. оно справедливо для n = 1 и
    2. из справедливости утверждения для какого-либо произвольного натурального n = k следует его справедливость для n = k+1.

В программировании этот прием называют рекурсией

Рекурсия - это способ определения множества объектов через само это множество на основе заданных простых базовых случаев.


Рекурсивной же будет называться процедура (функция), которая вызывает саму себя напрямую или через другие процедуры и функции
Пример рекурсивной процедуры:

procedure Rec(a: integer);
begin
    if a > 0 then
        Rec(a - 1);
    write(a);
end;
Схематично работу рекурсии можно изобразить блок-схемой

 
Процедура Rec() выполняется с параметром 3. Затем в внутри процедуры с параметром 3 вызывается процедура с параметром 2 и т.д., пока не произойдет вызов процедуры с параметром 0. При вызове процедуры с параметром 0 рекурсивного вызова уже не произойдет и процедуры с параметром 0 напечатает число 0 и закончит работу. Затем управление передается обратно в процедуру с параметром 1, она также заканчивает свою работу печатает число 1 и т.д. до процедуры с параметром 3. 

Все вызвавшиеся процедуры хранятся в памяти, до тех пор пока не закончат свою работу. Количество одновременно работающих процедур называется глубиной рекурсии.

Используя разобранную процедуру, добавьте в основной программе необходимые строки.
Разберитесь, почему программа выдает такой ответ


Вставьте недостающие фрагменты кода
Pascal
1
2


                                                   
3
procedure Rec(a: integer); 
4
begin 
5
    if a > 0 then 
6
        Rec(a - 1); 
7
    write(a); 
8
end; 
9


                                                   
10
begin 
11
12
13
end.