Новосибирский Государственный Университет
Опубликован: 05.02.2007 | Доступ: свободный | Студентов: 2223 / 413 | Оценка: 4.30 / 4.23 | Длительность: 10:15:00
Лекция 1:

Рекурсивные функции и структуры данных

Лекция 1: 123 || Лекция 2 >

Система программирования может быть задана как правило интерпретации или компиляции программ.

Определение 1.6

Система программирования – это комплекс средств и методов, используемых при подготовке и применении программ на одном или нескольких языках программирования.

Список из функции и перечня ее аргументов называется "форма" - синоним термина "выражение". Программа – это последовательность вычисляемых форм. Рекурсия – сведение к себе – позволяет такие правила записывать достаточно лаконично и ясно. Стек обеспечивает работу с рекурсивными функциями.

Определение 1.7

Стек - набор данных, в котором элементы обрабатываются согласно дисциплине "Первым пришел – последним ушел." (англ. Stack - пачка, стопка)

Повторное распределение памяти с помощью специального механизма "Сборка мусора" делает такую работу достаточно простой и надежной. Сложившийся на базе Лиспа стиль программирования называют функциональным.

Правило интерпретации использует ассоциативный список – таблицу для связывания обозначений с их определениями. При таком подходе переменные отличаются от констант лишь частотой изменения связи между именем и соответствующим ему данным.

Определение 1.8

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

Определение 1.9

Константа – именованная часть памяти, предназначенная для многократного доступа к фиксированным, не изменяющимся данным.

Типы данных в Лиспе включены в представление значений. Поэтому при вычислении они всегда известны и могут быть проверены в любой момент.

Определение 1.10

Тип данных – множество данных с соответствующим ему набором допустимых операций.

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

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

Термины "Ассоциативный список", "Атом", "Сборка мусора", "Свойства атома", "Список", "Символьные выражения", "S-выражения", "Форма", "Функциональное программирование" еще будут пояснены по ходу курса.

Элегантный лаконизм рекурсии может скрывать нелегкий путь. А.П.Ершов в предисловии к книге П.Хендерсона [2] привел поучительный пример задачи о рекурсивной формуле, сводящей вычитание единицы из натурального числа к прибавлению единицы:

{1 –1 =  0 ;  ( n +1 )  -1 = n  } ,

не поддавшейся А.Чёрчу и решенной С.Клини лишь в 1932 году:

Пример 1.11Запись с помощью алгоритмической нотации школьного курса информатики

{ F (x, y, z) = если (x = 1) то 0 иначе 
                       если  ((y +1) = x) то z  иначе F (x, y +1, z +1) ;
n –1  = F (n, 0, 0) }

алг F ( цел  x, y, z) арг x, y, z 
       нач 
            если  (x = 1)
                 то знач := 0
                 инес (y +1) /= x
           то знач := F (x, y +1, z +1)
       кон

алг N-1 (цел N) арг N нач  знач := F (N, 0, 0)  кон

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

Техника работы с функциями получает логическое завершение на уровне определения функций высших порядков, удобных для синтаксически управляемого конструирования программ на основе спецификаций, типов данных, визуальных диаграмм, формул и т.п. Программы на Лиспе могут выполнять роль спецификации обычных итеративно-императивных программ, что сближает технику программирования на Лиспе с общепризнанным теперь объектно-ориентированным программированием.

Лисп появился как язык символьной обработки информации. К середине семидесятых годов на Лиспе решались наиболее сложные в практике программирования задачи из области дискретной и вычислительной математики, экспериментального программирования, лингвистики, химии, биологии, медицины и инженерного проектирования. На Лиспе реализована система AutoCAD - автоматизация инженерных расчетов, дизайна и комплектации изделий из доступных элементов, и Emacs – весьма популярный текстовый редактор в мире UNIX/Linux.

Лекция 1: 123 || Лекция 2 >