Примеры
в предыдущих разделах были очень простыми. В этом
разделе рассмотрены примеры более сложных
программ, решающих задачи, которые было бы трудно
или невозможно решить без возможности
программирования.
Одной из черт, определяющих гибкость методов
программирования, является возможность
использовать одни программные структуры внутри
других. В Mathcad это можно сделать тремя путями:
- Один из операторов программы можно сделать, в
свою очередь, программой.
- Можно определить программу где-нибудь в другом
месте и вызывать ее из других программ так, как
если бы она была подпрограммой.
- Можно определить функцию рекурсивным образом.
Остальная часть этого раздела поясняет эти
методы на примерах.
Подпрограммы
Вспомнив, что программа является выражением,
состоящим из операторов, каждый из которых
содержит выражения, можно прийти к выводу, что
оператор в программе может быть другой
программой.
На Рисунке 8 приведены два примера программ,
содержащих оператор, являющийся, в свою очередь,
программой. Пример в правой части Рисунка 8
показывает пример вложенных программ с большим
числом уровней. Вообще говоря, предел для числа
уровней вложенных друг в друга программ
отсутствует. С практической точки зрения
программы со слишком большим числом уровней
вложенности могут оказаться слишком трудными
для понимания.
Одним из путей, которым многие программисты
избегают нагромождения сложных программных
конструкций, является перенесение сложностей в
“подпрограммы.” На Рисунке 9 показано, как это
можно сделать в Mathcad. Определив intsimp
где-нибудь в другом месте и использовав его
внутри adapt, можно сделать программу,
определяющую adapt, значительно проще.
Определение adapt стало бы значительно более
громоздким, если бы оба вхождения intsimp в него
нужно было бы заменять длиннющим определением intsimp,
приведенным в верхней части рисунка.
Функция adapt осуществляет адаптивную
квадратуру или интегрирование, используя intsimp
для аппроксимации площади на каждом
подинтервале интегрирования. Из последней
строки видно, что функция adapt вызывает сама
себя, т.е. определена рекурсивно. Рекурсивные
определения функций рассмотрены более подробно
в следующем разделе.
Рисунок 8: Программы, операторы которых сами
являются программами.
Рисунок 9: Использование подпрограммы для
устранения громоздкости.
Рекурсия
Рекурсия является одним из мощных методов
программирования и заключается в определении
функции через саму себя, как показано на Рисунке
10. Рекурсивные определения функций должны всегда
состоять по меньшей мере из двух частей:
- начального определения, предотвращающего
бесконечную рекурсию, и
- определения функции в терминах предыдущего
значения функции.
Основная идея подобна идее математической
индукции: если можно получить значение f(n+1)
из f(n) и известно f(0), то известна и вся
функция f.
Рисунок 10: Рекурсивное определение функции.
Следует, однако, помнить, что рекурсивные
определения функций далеко не всегда являются
самыми эффективными в вычислительном отношении,
несмотря на их краткость и элегантность. Часто
оказывается, что определения, использующие
операторы цикла, вычисляют нужные значения
быстрее.
|