Лекция 2 Раздел: Рекурсивная обработка списков Тема Лекции: Рекурсивная обработка линейных списков презентация

Содержание

Слайд 110.09.2008
Рекурсивная обработка линейных списков
Структуры и алгоритмы обработки данных, 1
Лекция 2
Раздел:
Рекурсивная

обработка списков
Тема Лекции:
Рекурсивная обработка линейных списков

Слайд 210.09.2008
Рекурсивная обработка линейных списков
Литература
Основная
Алексеев А. Ю., Ивановский С. А., Куликов Д. В. Динамические структуры данных: Учеб. пособие.

СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2004. (с. 20)
Дополнительная
Алагич С., Арбиб М. Проектирование корректных структурированных программ. М.: Радио и связь, 1984.
Хендерсон П. Функциональное программирование. Применение и реализация. М.: Мир, 1983.
Бауэр Ф.Л., Гооз Г. Информатика. Вводный курс: В 2 ч.- М.:Мир, 1990.
Фостер Дж. Обработка списков. М.: Мир, 1974

Слайд 310.09.2008
Рекурсивная обработка линейных списков
Учебный курс МТИ
Абельсон Х., Сассман Д.Д., Сассман Д. Структура

и интерпретация компьютерных программ – М.: Добросвет, КДУ, 2006

Массачу́сетсский технологи́ческий институ́т (англ. Massachusetts Institute of Technology, MIT) — университет) — университет и исследовательский центр) — университет и исследовательский центр, расположенный в Кембридже) — университет и исследовательский центр, расположенный в Кембридже (шт. Массачусетс) — университет и исследовательский центр, расположенный в Кембридже (шт. Массачусетс, США). Иногда также упоминается как Массачусетсский институт технологий и Массачусетсский технологический университет.


Слайд 410.09.2008
Рекурсивная обработка линейных списков

Модельное представление линейного списка
Скобочная запись: x =

(a b c d e) или [a, b, c, d, e] или (a; b; c; d; e)
Функции-селекторы: «голова» - head, first
«хвост» - tail, rest
применяются к непустому списку и позволяют разобрать его на составные части.
Например, Head(x) = a, Tail(x) = (b c d e),
Head( Tail(x) ) = b, Tail( Tail(x) ) = (c d e)

Слайд 510.09.2008
Рекурсивная обработка линейных списков
Функция-конструктор Cons(x, y)
x = a - элемент

базового типа,
y = (b c d e) - список
Cons(x, y) = (a b c d e)

Свойства:
Cons( Head(z), Tail(z)) = z
Head(Cons(x, y)) = x
Tail(Cons(x, y)) = y

Слайд 610.09.2008
Рекурсивная обработка линейных списков
Иллюстрация Cons( Head(z), Tail(z)) = z
Head(z)
z
Tail(z)
Cons( Head(z),

Tail(z) ) = z

Слайд 710.09.2008
Рекурсивная обработка линейных списков
Функция-конструктор Cons(x, y)
Пустой список: ( ) или

Nil
Cons(a, Nil) = Cons(a, ( )) = (a)

(a b c d e) = Cons(a, Cons(b, Cons(c, Cons(d, Cons(e, Nil)))))
Это «операционное» представление списка
(формальное определение скобочного представления - далее)

Функция-индикатор: Null(z)
Null(Nil) = true, z = (a b c d e) → Null(z) = false

Всегда Null(Cons(x, y)) = false

Слайд 810.09.2008
Рекурсивная обработка линейных списков
Примеры
Пример 1.1. Функция Size, вычисляющая число элементов (длину)

списка.

Случай 1: y = Nil Size(y) = 0
Случай 2: y ≠ Nil пусть Size(Tail(y)) = n,
тогда Size(y) = n + 1.
Рекурсивная функция

Size(y) = if Null(y) then 0 else Size(Tail(y)) + 1.


Слайд 910.09.2008
Рекурсивная обработка линейных списков
Примеры
Пример 1.2. Функция Sum, вычисляющая сумму элементов числового

списка.

Случай 1: y = Nil Sum(y) = 0
Случай 2: y ≠ Nil пусть Sum(Tail(y)) = s, тогда Sum(y) = Head(y) + s.
Рекурсивная функция

Sum(y) = if Null(y) then 0 else Head(y) + Sum(Tail(y)).


Слайд 1010.09.2008
Рекурсивная обработка линейных списков
Пример 1.3. Число вхождений Numb(x, y) элемента x

в список y

Случай 1: y = Nil Numb( x, y) = 0
Случай 2: y ≠ Nil пусть Numb(x, Tail(y)) = n, тогда
подслучай 2.1: x = Head(y) → Numb( x, y) = n + 1
подслучай 2.2: x ≠ Head(y) → Numb( x, y) = n
Рекурсивная функция

Numb( x, y) = if Null(y) then 0
else if x = Head(y) then Numb(x, Tail(y)) + 1
else Numb(x, Tail(y))


Слайд 1110.09.2008
Рекурсивная обработка линейных списков
Пример 1.4. Функция Concat, соединяющая два списка в

один. Например, Concat(y, z) = (a b c d) для y = (a b) и z = (c d).

Случай 1: y = Nil Concat(y, z) =  z Случай 2: z = Nil Concat(y, z) =  y Случай 3: y ≠ Nil и z ≠ Nil пусть Concat(Tail(y), z) = u,
тогда Concat(y, z) = Cons(Head(y), u)

y

z

Head(y)

Tail(y)


Concat(Tail(y), z) = u


Слайд 1210.09.2008
Рекурсивная обработка линейных списков
Пример
Concat((a b), (c d)) = Cons(a, Concat((b), (c d))).
Concat((b), (c

d)) = Cons(b, Concat(Nil, (c d))).
Concat(Nil, (c d)) = (c d).
Concat((b), (c d)) = Cons(b, (c d)) = (b c d).
Concat((a b), (c d)) = Cons(a, (b c d)) = (a b c d) .
Замечания: 1. Список y разбирается и затем собирается даже если список z пуст.
2. Функция Cons вызывается Size(y) раз.

Рекурсивная функция
Concat(y, z) = if Null(y) then z else Cons(Head(y), Concat(Tail(y), z)).


Слайд 1310.09.2008
Рекурсивная обработка линейных списков
Разборка и сборка при выполнении функции Concat(y, z)


y
z


Слайд 1410.09.2008
Рекурсивная обработка линейных списков
Пример 1.5. Функция Append, добавляющая элемент x в

конец списка y.
Например, Append(y, x) = (a b c) для y = (a b) и x = c .
Append(y, x) = Concat(y, Cons(x, Nil)).
Пример 1.6. Функция Reverse, обращающая список. Например, Reverse((a b c)) = (c b a) .
Reverse(y) = if Null(y) then Nil
else Concat (Reverse(Tail(y)), Cons(Head(y), Nil)).

Head(y)





Reverse(Tail(y))

Tail(y)






Слайд 1510.09.2008
Рекурсивная обработка линейных списков


Слайд 1610.09.2008
Рекурсивная обработка линейных списков
Сложность функции Reverse (начало)
Concat(y, z) =
if Null(y) then

z else Cons(Head(y), Concat(Tail(y), z)).

Количество вызовов C(n) функции Cons в Concat,
где n = Size(y)
C(n) = C(n − 1) + 1; C(0) = 0
→ C(n) = n

Слайд 1710.09.2008
Рекурсивная обработка линейных списков
Сложность функции Reverse (продолжение)
Reverse(y) = if Null(y) then

Nil
else Concat (Reverse(Tail(y)), Cons(Head(y), Nil) ).
Количество вызовов R(n) функции Cons в Reverse
R(n) = R(n − 1) + 1 + C(n − 1) ; R(0) = 0
R(n) = R(n − 1) + 1 + (n − 1) = R(n − 1) + n;
Метод итераций:
R(n) = R(n − 1) + n = R(n − 2) + (n − 1) +n =
= R(n − 3) + (n − 2) + (n − 1) +n = …
R(n) = n + (n − 1) + (n − 2)+…+ 2 + 1 = n(n + 1)/2
Итак, R(n) = n(n + 1)/2

Слайд 1810.09.2008
Рекурсивная обработка линейных списков
Отступление (напоминание): Накапливающие параметры в рекурсивных подпрограммах
fact (n) ≡

if n = 0 then 1 else fact (n − 1) ⋅ n
fact (4) = fact (3) ∗ 4
fact (3) = fact (2) ∗ 3
fact (2) = fact (1) ∗ 2
fact (1) = fact (0) ∗ 1 = 1 ∗1=1
fact (2) = fact (1) ∗ 2 = 1 ∗ 2 = 2
fact (3) = fact (2) ∗ 3 = 2 ∗ 3 = 6
fact (4) = fact (3) ∗ 4 = 6 ∗ 4 = 24


Слайд 1910.09.2008
Рекурсивная обработка линейных списков
Накапливающие параметры
Рассмотрим вспомогательную функцию двух аргументов fct(n,m):
fct(n,m)

≡ if n = 0 then m else fct(n − 1,m⋅n);
Тогда fact(n) ≡ fct(n,1).
m – накапливающий параметр
fact(4) ≡ fct(4,1)
= fct(3,4) = fct(2,3*4) = fct(1,2*12) = fct(0,24) =24

Замечание о стеке и хвостовой рекурсии.
(см. след. слайды)

Слайд 2010.09.2008
Рекурсивная обработка линейных списков
Замечание 1. Все умножения производятся при вычислении fct(n,m)

по ходу прокладки трассы.
Замечание 2. Вспомнить рекурсивное вычисление чисел Фибоначчи

Представление и обработка структурированных данных: Практикум по программированию
/ С. А. Ивановский, В. А. Калмычков, А. А. Лисс, В. П. Самойленко.
СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2002. 96 с.


Слайд 2110.09.2008
Рекурсивная обработка линейных списков
Рекурсивный алгоритм и вычислительные процессы
Замечание о стеке и

хвостовой рекурсии.

Рекурсивный алгоритм

Стек хранит всю «предысторию» (трассу)

Рекурсивный ВП

Текущее состояние определяется параметрами

Итеративный ВП


Слайд 2210.09.2008
Рекурсивная обработка линейных списков
Рекурсия и итерация
Функции fact(n) ≡ fct(n,1);
fct(n,m) ≡

if n = 0 then m else fct( n − 1, m⋅n );
соответствует итеративный алгоритм

m := 1; {n = n0 ≥ 0}
While n ≠ 0 do {инв: n0! = n! * m}
m := n * m;
n := n − 1
od
{m = n0!}


Слайд 2310.09.2008
Рекурсивная обработка линейных списков
Схема программы и её интерпретация
mm = 1; nn

= 0;
h(x, y) = x * y; g(x) = x – 1; f(x) = x!
q(x, y) = x * y;

m := mm; {n = n0}
While n ≠ nn do {инв: f(n0) = q(f(n), m)}
m := h (n, m);
n := g(n)
od
{m = f(n0)}


Слайд 2410.09.2008
Рекурсивная обработка линейных списков
Интерпретация со списками m и n
mm = Nil;

nn = Nil;
h(x, y) = ConsHead (x, y) = Cons (Head (x), y);
g(x) = Tail (x); f(x) = Reverse (x);
q(x, y) = Concat (x, y);

m := Nil; {n = n0}
While n ≠ Nil do
{инв: Reverse (n0) = Concat (Reverse (n), m) }
m := ConsHead (n, m);
n := Tail (n)
od
{m = Reverse (n0)}


Слайд 2510.09.2008
Рекурсивная обработка линейных списков
m := Nil; {n = n0}
While

n ≠ Nil do
{инв: Reverse (n0) = Concat(Reverse (n), m)}
m := ConsHead (n, m);
n := Tail (n)
od
{m = Reverse (n0)}







n



m

n’

m’

Head(n)

Tail(n)


Слайд 2610.09.2008
Рекурсивная обработка линейных списков

Пример 1.7. Функция Reverse2, обращающая список.
Введем вспомогательную функцию

Rev, второй параметр которой используется как «накапливающий»:
Rev(y, z) = if Null(y) then z
else Rev (Tail(y), Cons (Head(y), z));
Тогда Reverse2 (y) = Rev (y, Nil).






y

z




Tail(y)



Слайд 2710.09.2008
Рекурсивная обработка линейных списков
Пример. Reverse2 (y) при y = (a b)


Слайд 2810.09.2008
Рекурсивная обработка линейных списков
Количество вызовов конструктора Cons при обращении функцией Reverse2

списка длины n.

Q(n) = Q(n − 1) + 1,
Q(0) = 0
Q(n) = n (!)

Ср. с R(n) = n(n + 1)/2


Слайд 2910.09.2008
Рекурсивная обработка линейных списков
Формальное определение линейного списка
См. с.20-23 в файле «1Списки»


Слайд 3010.09.2008
Рекурсивная обработка линейных списков
Определение скобочной записи линейного списка
::= |

< Non_null_list(El) >
< Null_list> ::= Nil
< Non_null_list(El) > ::= < Pair(El) >
< Pair(El) > ::= ( < Head_l(El) > . < Tail_l(El) > )
< Head_l(El) > ::= < El >
< Tail_l(El) > ::= < L_list(El) >

Здесь L_list(El) – линейный список из элементов типа El,
Null_list – пустой список,
Non_null_list(El) – непустой линейный список,
Head_l(El) – «голова» списка,
Tail_l(El) – «хвост» списка,
Pair(El) – упорядоченная пара «голова»–«хвост», т. е. элемент декартова произведения.
Терминальные символы:
Nil обозначает пустой список,
( . ) использованы для обозначения элемента декартова произведения.

Слайд 3110.09.2008
Рекурсивная обработка линейных списков
Примеры
(a . (b . (c . (d . Nil)))) → (a . (b . (c . (d ))))
(a . (b . (c . (d )))) → (a . (b . (c d )))
(a . (b c d )) →

(a b c d ))

Слайд 3210.09.2008
Рекурсивная обработка линейных списков
Функциональная спецификация линейного списка
Базовые функции:
индикатор Null

(предикат: список пуст),
селекторы Head («голова» списка) и Tail («хвост» списка),
конструктор Cons
0) Nil: → Null_list;
1) Null: L_list(El) → Boolean;
2) Head: Non_null_list(El) → El;
3) Tail: Non_null_list(El) → L_list(El);
4) Cons: El ⊗ L_list(El) → Non_null_list(El);
f(x) или f() обозначено f: A→B
f(x, y) или f(,) обозначено f: A ⊗ B →C

Слайд 3310.09.2008
Рекурсивная обработка линейных списков
Система правил (аксиом) А1−А5
A1) Null(Nil) = true;
A2)

Null(Cons(x, y)) = false;
A3) Head(Cons(x, y)) = x;
A4) Tail(Cons(x, y)) = y;
A5) Cons(Head(z), Tail(z)) = z.

для всех x типа El,
для всех y типа L_list( El ),
для всех z типа Non_null_list( El )

Слайд 3410.09.2008
Рекурсивная обработка линейных списков
Использование функции Cons для конструирования списков
(a) =

(a . Nil) = Cons(a, Nil);
(a b c) = (a. (b. (c. Nil))) = Cons(a, Cons (b, Cons (c, Nil))).
Построение каждой «точечной» пары (значения типа Pair( El ) ) требует однократного применения конструктора Cons.
Определение типа Pair(El), не связанное с конкретным (скобочным) представлением :
< Pair(El) > ::= Cons( < Head_l(El) > , < Tail_l(El) > )
Это «операционное» представление списка

Правило А5 становится при этом излишним и может быть выведено из аксиом А3, А4 (проверить!).


Слайд 3510.09.2008
Рекурсивная обработка линейных списков
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ

ЛЕКЦИИ

КОНЕЦ ЛЕКЦИИ

КОНЕЦ ЛЕКЦИИ

КОНЕЦ ЛЕКЦИИ

КОНЕЦ ЛЕКЦИИ


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика