- •Федеральное государственное учреждение
- •©Российская таможенная академия, 2008
- •Ростовский филиал
- •© Крицкий с.П.
- •Содержание
- •Введение
- •Основные понятия программирования
- •Классификация языков программирования
- •Характеристика систем программирования на языкахJavaScript/Jscript
- •Типы значений в языкеJavaScript
- •Числовые литералы и значения и их организация в памяти Литералы целых чисел
- •Литералы вещественных чисел (чисел с плавающей точкой)
- •Логические литералы и значения и их организация в памяти
- •Строковые литералы, значения и их организация в памяти
- •Массивы и их организация в памяти. Многомерные массивы, матрицы
- •Записи и их организация в памяти
- •Операции над различными типами данных
- •Арифметические операции
- •Строковые операции
- •Логические операции
- •Операции сравнения
- •Операции выборки
- •Переменные, выражения, условия Переменные
- •Выражения
- •Вызовы функций и методов
- •Порядок вычисления выражения
- •Операции присваивания
- •Автоматическое преобразование типов значений. Функции преобразования и проверки типов
- •Ввод и вывод значений
- •Понятие оператора. Простые и составные операторы. Блок-схемы программ и модулей Операторы и модули
- •Блок-схемы
- •Составные операторы (последовательность, условные). Их синтаксис, блок-схемы и правила выполнения Последовательность операторов
- •Условный операторif … else
- •Операторы цикла (while, do-while и for). Их синтаксис, блок-схемы и правила выполнения. Операторыbreakиcontinue Оператор циклаwhile
- •Операторbreak
- •Операторcontinue
- •Оператор циклаdo…while
- •Оператор циклаfor
- •Функции. Определение и вызов. Выход из функцииreturn. Массив аргументовarguments Определение функции – операторfunction
- •Выход из функции – операторreturn
- •Определение переменной – операторvar
- •Отладка программ. Трассировка, отладочная печать. Тестирование программы
- •Основные понятия объектного подхода
- •ОбъектMath, назначение, свойства, методы. Значения NaN, Infinity, null, undefined.
- •Свойства объектаMath– константы:
- •Методы объекта Math
- •Специальные константы
- •Массивы как объекты в языкеJavaScript. Конструкторы, свойства и методы массивов. Задача копирования массива вJavaScript
- •Конструктор объектов типаArray
- •Свойство объектов типаArray
- •Методы объектов типаArray
- •Типичные задачи с массивами: линейная алгебра
- •Скалярное произведение векторов
- •Произведение матриц
- •Транспонирование квадратной матрицы
- •Типичные задачи с массивами: сортировка. Сортировка вставками. Методsort
- •Сортировка вставками
- •Методsort
- •Типичные задачи с массивами: поиск. Двоичный поиск в упорядоченном массиве
- •Обработка строк. Конструкторы, свойства, методы строк
- •Конструктор объектов типаString
- •Свойство объектов типаString
- •Методы объектов типаString
- •Шаблоны и регулярные выражения. Их использование методами строк.
- •Простые шаблоны
- •Составные шаблоны
- •Пользовательский интерфейс программ. Общее понятие
- •Html-страница как средство интерфейса для программ на языкеJavaScript. Тэги и атрибутыHtml
- •ОбъектыHtml-страниц иWeb-браузера, их свойства и методы. События и их обработка Объектные модели
- •Объекты страницы
- •Объекты браузера
- •СтилиHtml-объектов. Свойства позиционирования объектов страницы
- •Таймеры, примеры использования
- •Понятие ссылочной структуры данных. Односвязный список. Запись списков с помощью литералов.
- •Понятие стека. Функции для стека
- •Двухсвязный список, его структура
- •Понятие очереди и дека, их организация
- •Понятие дерева как ссылочной структуры. Бинарные деревья. Представление дерева литералом
- •Обработка деревьев. Рекурсия
- •Обход дерева «в глубину»
- •Обход дерева «в ширину»
- •Файлы и файловая система
- •Работа с текстовыми файлами
- •Объекты типа TextStream
- •Управление файлами и папками
- •Коллекции дисков, папок и файлов
- •Технология и методология создания программ
- •Жизненный цикл программы
- •Организация процесса разработки
- •Методологии проектирования программ
- •Заключение
- •Приложение 1. Теги, атрибуты и соответствующие свойства Общая структура html-документа
- •Форматирование текста
- •Вставка графики
- •Гиперссылки и карты
- •Приложение 2. События вHtmLи их источники
- •Приложение 3. Атрибуты и свойства стилейCss
- •Приложение 4. Работа с файловой системой вJScript
- •Свойства, методы и коллекции объектов файловой системы
- •Список литературы
- •Словарь терминов
- •If (условие) оператор1 [else оператор2]
- •Основы программирования
Обработка деревьев. Рекурсия
Обработка деревьев часто связана с обходом дерева, т.е. с посещением всех его узлов в определённой последовательности. Наиболее популярны два метода обхода дерева – «в глубину» (сначала в глубину, потом в ширину) и « в ширину» (сначала в ширину, потом в глубину).
Глубиной вершины в дереве называется число её предков, т.е. количество шагов вверх от вершины до корня, так что сам корень имеет глубину 0. Все вершины с глубиной n образуют n-й уровень дерева (см. рис. 10). Число узлов n-го уровня называется его шириной.
Поддеревом с корнем в узле N называется часть дерева, состоящая из узла N и всех его потомков. Так, на рис. 10 поддерево с корнем «Пётр» состоит из узлов «Пётр», «Павел», «Мария» и «Алексей». Очевидно, дерево является своим собственным поддеревом, а всякое поддерево является деревом.
Обход дерева «в глубину»
Обход дерева «в глубину» начинается с корня дерева, который в этот момент считается текущим узлом. Для каждого текущего узла применяется следующий алгоритм (его описание приводится на псевдокоде).
Алгоритм обхода «в глубину» для узла N:
Если у N нет потомков, обработать этот узел и завершить алгоритм для него.
Иначе
выполнить предварительные действия для N;
применить алгоритм обхода «в глубину» для его первого дочернего узла; после завершения алгоритма выполнить следующий шаг;
выполнить промежуточные действия для N;
применить алгоритм обхода «в глубину» для его второго дочернего узла; после завершения алгоритма выполнить следующий шаг;
выполнить промежуточные действия для N;
…
применить алгоритм обхода «в глубину» для его последнего дочернего узла; после завершения алгоритма выполнить следующий шаг;
выполнить заключительные действия для N и завершить алгоритм для него.
Конец алгоритма.
Таким образом, обходя дерево с корнем N, алгоритм последовательно обходит поддерево каждого его дочернего узла, каждый раз спускаясь до самого нижнего уровня. Т.е. движение происходит сначала в глубину дерева, а потом в ширину.
Особенностью описанного алгоритма является то, что он обращается сам к себе. В данном случае алгоритм, применённый к узлу дерева, применяет сам себя к его дочерним узлам (и, косвенно, к каждому потомку). Такие алгоритмы называются рекурсивными (повторяющимися, возвращающимися к самому себе). В языках программирования для их описании используются рекурсивные функции (процедуры, методы), которые прямо или косвенно вызывают сами себя. В языке JavaScript для их использования не требуется никаких дополнительных средств.
В качестве примера приведём рекурсивную функцию, которая выводит на экран имена в генеалогическом дереве в порядке «сверху вниз – слева направо».
function inDepth(N) // N – узел дерева
{document.write(N.man+" ");
if (N.f!=null) inDepth(N.f);
if (N.m!=null) inDepth(N.m)
}
Для дерева на рис. 10 будет напечатано
Иван Пётр Павел Алексей Мария Ирина Елена
Нетрудно изменить эту программу, чтобы дерево печаталось «снизу вверх» или «справа налево». Достигается это лишь перестановкой операторов.
Обход дерева «в ширину»
При обходе дерева «в ширину» сначала последовательно посещаются все узлы 0-го уровня (один узел – корень дерева), затем все узлы 1-го уровня, затем 2-го и т.д. Достигается это с помощью дополнительной очереди, в которую сначала заносится корень дерева, а потом для каждого выбираемого из очереди узла дерева в неё заносятся его дочерние узлы. Таким образом, узлы следующего уровня всегда будут стоять в очереди после узлов предыдущего уровня. Обход дерева закончится, когда закончится очередь. Опишем этот алгоритм на псевдокоде.
Алгоритм обхода дерева «в ширину»:
Создать очередь из одного узла – корня дерева.
Пока очередь не пуста, выполнять тело цикла:
выбрать первый узел из очереди;
обработать его;
последовательно занести в очередь его дочерние узлы.
Конец тела цикла.
Конец алгоритма.
Как видим, этот алгоритм не рекурсивный. Его легко реализовать с помощью рассмотренных ранее функций для работы с двухсвязными списками и очередями. Для примера приведём функцию печати генеалогического дерева по уровням.
function inWidth(R)
{var Q = createQue([R]), N;
while (Q.next != null)
{N = outQue(Q).info;
document.write(N.man + " ");
if (N.f != null) inQue(N.f,Q);
if (N.m != null) inQue(N.m,Q);
}
};
Для дерева на рис. 10 будет напечатано
Иван Пётр Ирина Павел Мария Елена Алексей
