Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОДНОСВ. СПИСКИ МУ.doc
Скачиваний:
12
Добавлен:
13.02.2015
Размер:
236.03 Кб
Скачать

Упражнение

1) Описать процедуру ViewRec_1 выдачи элементов списка в обратном порядке.

Пример 9.2 Рекурсивная функция вычисления суммы значений всех элементов списка.

Алгоритм вычисления суммы:

если список пуст, то сумма = 0,

иначе сумма = значение элемента + сумма следующих элементов списка.

function Sum(start:link):integer;

begin

if start=nil then Sum:=0

else Sum:=start^.inf+Sum(start^.next)

end;

Пример 9.3 Рекурсивная функция подсчёта числа вхождений заданного значения в список.

Алгоритм аналогичен алгоритму вычисления суммы.

function Cout(start:link; x:integer):integer;

begin

if start=nil then Cout:=0

else

if start^.inf = x then

Cout:= 1 + Cout(start^.next,x)

else Cout:= Cout(start^.next,x)

end;

Пример 9.4 Рекурсивная функция вычисления произведения значений элементов непустого списка.

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

function Mult(start:link):integer;

begin

if start<>nil then

if start^.inf =0 then Mult:=0

else

Mult:=start^.inf * Mult(start^.next)

else Mult:=1

end;

Замечание. Проверка списка на пустоту должна выполняться в вызывающей программе.

Пример 9.5 Функция вычисления среднего арифметического значений элементов непустого списка.

Решение оформлено в виде нерекурсивной функции Average, которая содержит внутреннюю рекурсивную процедуру S_k с параметрами:

start – указатель на начало списка,

S – сумма значений элементов списка,

k – количество элементов списка.

function Average(start:link):real;

var S,k:integer; {сумма и число элементов списка}

{ рекурсивная процедура вычисления S и k }

procedure S_k(start:link; var S,k:integer);

begin

if start=nil then

begin

S:=0;

k:=0

end

else

begin

S_k(start^.next, S, k);

S:=S+start^.inf;

k:=k+1

end

end;

begin

S_k(start, S,k);

Average:=S/k

end;

Замечание. Проверка списка на пустоту должна выполняться в вызывающей программе.

Пример 9.6 Рекурсивная функция поиска в списке элемента с заданным значением x.

Алгоритм поиска элемента:

если список пуст, то возвращается пустая ссылка,

иначе если элемент найден, то возвращается ссылка на него,

иначе поиск элемента продолжается, начиная со следующего элемента.

function Search_Rec(start:link; x:integer): link;

begin

if start=nil then Search_Rec:=nil

else

if start^.inf=x then

Search_Rec:=start

else Search_Rec:= Search_Rec (start^.next, x)

end;

Пример 9.7 Рекурсивная процедура дублирования первого вхождения элемента списка с заданным значением x.

Алгоритм дублирования элемента:

если список не пуст, то

если найден элемент с заданным значением x,

то после него вставляется его дубликат,

иначе поиск элемента со значением x и вставка его дубликата продолжаются в "хвосте" списка, начиная со следующего элемента.

procedure Double(start:link; x:integer);

var p:link; {указатель на новый элемент}

begin

if start<>nil then

if start^.inf=x then

begin

new(p); p^.inf:=x;

p^.next:=start^.next; start^.next:=p

end

else Double(start^.next, x)

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]