Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 6 Итерация и рекурсия.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
348.16 Кб
Скачать

Пример обработки рекуррентной последовательности

Техника работы с рекуррентными соотношениями полезна также при составлении программ обработки последовательностей, когда эффективнее не вычислять каждый член по общей формуле, а получать очередной элемент, зная значение предыдущего. Рассмотрим задачу суммирования ряда: Конечно, можно для каждого слагаемого вычислять , но тогда время суммирования сильно возрастет.

Вычисление можно ускорить, если воспользоваться соотношением: . Слагаемые ряда можно определить при помощи рекуррентной последовательности первого порядка:

, .

Сумма накапливается параллельно с вычислением элемента рекуррентной последовательности, удовлетворяющего заданному условию. program Sum; var n, k: integer; a, s: real; begin writeln ('Введите целое число n'); readln ( n ); a:=1; s:=a; for k:=1 to n do begin a:=a/2; s:=s+a; end; writeln ('Сумма равна ', s:5:3); end.

Произвольное количество вложенных циклов

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

Для примера напишем процедуру, печатающую все возможные сочетания по k чисел из всех от 1 до n ( ). Числа, входящие в каждое сочетание, будем печатать в порядке возрастания. Сочетания из n чисел по 2 печатаются так:

for i1 := 1 to n do

  for i2 := i1 + 1 to n do

    writeln(i1, ' ', i2);

Сочетания из n чисел по 3 так:

for i1 := 1 to n do

  for i2 := i1 + 1 to n do

    for i3 := i2 + 1 to n do

      writeln(i1, ' ', i2, ' ', i3);

Однако, если количество чисел в сочетании задается переменной, то придется прибегнуть к рекурсии, например:

program Sum;

var

n, i: integer;

t: array [0..10000] of integer;

procedure Combinations(n, k: integer;

  //Массив, в котором будем формировать сочетания

var Indexes: array [0..10000]of integer;

  //Счетчик глубины рекурсии

d: integer);

var

i, i_min: integer;

s: string;

begin

if d < k then

begin

if d = 0 then

i_min := 1

else

i_min := Indexes[d-1] + 1;

for i := i_min to n do

begin

Indexes[d] := i;

Combinations(n, k, Indexes, d+1);

end;

end

else

begin

for i := 0 to k-1 do

write(Indexes[i], ' ');

writeln;

end;

end;

begin

n:=4;

writeln;

Combinations(n,3,t,i);

writeln;

end.