ВУЗ:
Составители:
Рубрика:
- 22 -
Рассмотрим ещё одну задачу: «Не используя операторов цикла и
перехода, описать функцию sum(L), вычисляющую сумму элементов списка
целых чисел L. Считать, что сумма пустого списка равна нулю, и что список
представлен цепочкой звеньев без заглавного звена».
Поскольку циклы запрещены условием задачи, для прохода по списку
воспользуемся рекурсией (как в реализации процедуры print1). Дадим
рекурсивное определение суммы списка. Сумма пустого списка равна нулю,
сумма непустого списка есть результат сложения «головы» с суммой «хвоста»:
0, если L пуст,
sum(L)=
L↑.elem+sum(L↑.next),иначе.
Теперь запишем определение функции на Паскале.
function sum(L:list):integer;
begin
if L = nil then sum:= 0
else sum:= L↑.elem +
sum(L↑.next)
end;{sum}
Параметр L передаётся по значению. Поэтому при каждом вызове этой
функции создаётся локальная (по отношению к данному вызову) переменная L,
и ей присваивается значение фактического параметра. При выходе из функции
локальная переменная исчезает, и значение функции возвращается в точку
обращения к ней. При рекурсивном обращении могут одновременно
существовать несколько (различных !)
локальных переменных с именем L (по
одной для каждого вызова). Рисунок 1 иллюстрирует выполнение оператора
write(sum(Z))основной программы, где Z представляет список <5,-3>.
Очереди и стеки
В повседневной жизни часто приходится иметь дело с хранилищами
различных объектов. В библиотеке хранятся книги; в автоматическом оружии
есть магазин, в котором хранятся патроны; в холле парикмахерской «хранятся»
клиенты, ожидающие своей очереди на обслуживание. Хранилище может быть
пустым, если в данный момент никаких объектов в нём нет. Независимо от
того, как
устроено хранилище, и какие объекты в нём хранятся, можно выделить
два основных действия для работы с ним: 1) добавить объект (положить на
хранение); 2) взять объект (изъять из хранилища). Если потребовать, чтобы
операции добавления и изъятия объектов удовлетворяли некоторым условиям,
можно выделить два особых типа хранилищ: очередь и стек.
Рассмотрим ещё одну задачу: «Не используя операторов цикла и перехода, описать функцию sum(L), вычисляющую сумму элементов списка целых чисел L. Считать, что сумма пустого списка равна нулю, и что список представлен цепочкой звеньев без заглавного звена». Поскольку циклы запрещены условием задачи, для прохода по списку воспользуемся рекурсией (как в реализации процедуры print1). Дадим рекурсивное определение суммы списка. Сумма пустого списка равна нулю, сумма непустого списка есть результат сложения «головы» с суммой «хвоста»: 0, если L пуст, sum(L)= L↑.elem+sum(L↑.next),иначе. Теперь запишем определение функции на Паскале. function sum(L:list):integer; begin if L = nil then sum:= 0 else sum:= L↑.elem + sum(L↑.next) end;{sum} Параметр L передаётся по значению. Поэтому при каждом вызове этой функции создаётся локальная (по отношению к данному вызову) переменная L, и ей присваивается значение фактического параметра. При выходе из функции локальная переменная исчезает, и значение функции возвращается в точку обращения к ней. При рекурсивном обращении могут одновременно существовать несколько (различных !) локальных переменных с именем L (по одной для каждого вызова). Рисунок 1 иллюстрирует выполнение оператора write(sum(Z))основной программы, где Z представляет список <5,-3>. Очереди и стеки В повседневной жизни часто приходится иметь дело с хранилищами различных объектов. В библиотеке хранятся книги; в автоматическом оружии есть магазин, в котором хранятся патроны; в холле парикмахерской «хранятся» клиенты, ожидающие своей очереди на обслуживание. Хранилище может быть пустым, если в данный момент никаких объектов в нём нет. Независимо от того, как устроено хранилище, и какие объекты в нём хранятся, можно выделить два основных действия для работы с ним: 1) добавить объект (положить на хранение); 2) взять объект (изъять из хранилища). Если потребовать, чтобы операции добавления и изъятия объектов удовлетворяли некоторым условиям, можно выделить два особых типа хранилищ: очередь и стек. - 22 -
Страницы
- « первая
- ‹ предыдущая
- …
- 20
- 21
- 22
- 23
- 24
- …
- следующая ›
- последняя »