Россия, Новосибирск, НГПУ, 1994 |
Процедурное программирование
11.1.2. Функция Which
Хотя выражение в In[1] на рис. 11.3 работает эффективно и правильно (в чём мы убедились в In[2]), сама запись условий при помощи каскада условных операторов достаточно громоздка и крайне неудобна для восприятия.
Задать выполнение тех же самых действий при тех же самых условиях можно гораздо более простым способом — воспользовавшись оператором множественных альтернатив Which. Как уточняет Е. М. Воробьёв [1, с. 169], "условный оператор Which[test1,expr1,test2,expr2,...] имеет четное число 2n аргументов, среди которых n тестов testi и п выражений expri". При вычислении выражения Which[...] конечным результатом является результат вычисления первого из expri, для которого соответствующее условие testi возвращает True.
Зададим при помощи оператора Which новую пользовательскую функцию posByWhich, которая осуществляет те же действия, что и заданная при помощи If функция posByIf — см. In[1] на рис. 11.4. Результаты действия обеих функций (Out[2] на рисунках 11.3 и 11.4) полностью идентичны.
Если все выражения test1 возвращают при вычислении False, значение выражения с заголовком Which равняется Null. Порой оказывается полезным в этом случае заставить Mathematica выполнять какое-либо действие, например, выводить сообщение. Для этих целей Е. М. Воробьёв [1, с. 169] предлагает в качестве последних двух аргументов функции Which добавить ещё одну пару test,expr, при этом вместо test следует указать выражение True, а вместо expr — требуемое действие.
В примере In[1] на рис. 11.5 мы задали условный оператор Which, задав в нём заведомо неверные условия. При попытке его вычислить мы даже не удостоились вывода на экран ячейки Out. В примере In[2] на том же рисунке к аргументам выражения Which[...] мы добавили ещё два — True и "какая-то ошибка". Теперь, заставив Mathematica вычислить вновь заданное выражение, мы всё-таки получили от программы ответ.
Если в процессе вычисления выражения Which[...] первые тесты вернули значение False, и дошла очередь до теста, которые имеет отличное от булевого значение, то редуцированное выражение Which[...] просто перепечатывается в ячейку Out (см. пример In[3] на рис. 11.5).
Подробней о функции Which см. книги Е. М. Воробьёва [1, с. 169] и П. Веллина и др. [14, с. 136–137].
11.1.3. Функция Switch
Осуществлять ветвление вычислений, то есть, для одного и того же выражения возвращать при вычислении разные результаты, можно не только в зависимости от выполнения некоторых логических условий, но и в зависимости от вида самого выражения. Функция Switch[expr,patt1,expr1,patt2,expr2,...] вычисляет выражение expr1, если expr соответствует шаблону patt1, вычисляет expr2, если expr соответствует шаблону patt2 и т.д. Если выражение expr соответствует сразу нескольким шаблонам, вычисляется то выражение expri, подходящий шаблон которого patti проверяется раньше остальных.
В примере In[1] на рис. 11.6 мы определяем пользовательскую функцию powercheck одного аргумента, которая выясняет, является ли её аргумент символом в степени 1, 2, 3 или 4, и печатает соответствующее сообщение: первая степень, квадрат, куб, четвёртая степень. В примере In[2] мы проверяем действие нашей функции powercheck на нескольких примерах.
В предыдущем примере мы задали в качестве аргументов функции powercheck только такие выражения, которые соответствуют одному из шаблонов в её теле. В примере In[3] на рис 11.6 мы опробовали действие powercheck на выражении, шаблона для которого в её теле нет. В Out[3] в качестве результата мы получили переписанное в исходном виде входящее в тело функции powercheck выражение Switch[...].
Для того, чтобы функция Switch определённым образом реагировала на ситуацию, когда выражению expr не находится подходящего шаблона, например, выполняла выражение exprlast, то в качестве последних двух аргументов функции Switch добавляют выражение _,exprlast. В примере In[4] на рис 11.6 мы немного модифицируем нашу функцию powercheck, добавив в Switch пару новых аргументов. Теперь на отличное от символа в степени 1, 2, 3 или 4 выражение, введённое в качестве аргумента, функция powercheck будет выдавать сообщение "введите другое выражение".
Подробней о функции Switch см. книги Е. М. Воробьёва [1, с. 170–171] и П. Веллина и др. [14, с. 136–137].
11.1.4. Функция Piecewise
Использование условных операторов оказывается непременным при задании кусочных математических функций. Специально для этих целей в Mathematica имеется функция Piecewise. В простейшем случае она задаётся как Piecewise[{{expr1,cond1},{expr2,cond2},...}]. При вычислении данной функции вычисляется выражение expr1, если выполняется условие cond1, вычисляется выражение expr2, если выполняется условие cond2 и т.д. Если ни одно из условий не выполняется, то результатом вычисления Piecewise является 0; для того, чтобы задать вместо 0 другое выражение otherexpr, следует указать его в качестве последнего аргумента функции Piecewise.
В примере In[1] на рис. 11.7 мы задаём математическую функцию одного аргумента x, которая возвращает -x, когда x<-1 и x2, когда x>1; в остальных случаях функция принимает значение 1. В In[2] мы строим график нашей зависимости от аргумента x.
П. Веллин и др. в книге [14, с. 138] при помощи Piecewise определяет функцию, возвращающую абсолютное значение аргумента. В In[3] на рис. 11.7 определим функцию abswal, имеющую то же назначение. В примерах In[4] и In[5] мы проверяем действие функции abswal на числе -5 и символе h. В последнем примере ячейка Out[5] содержит результат вычисления функции abswal[h] отдельно для отрицательного и положительного значений h. Результатом дифференцирования abswal[h] также является набор значений в зависимости от знака аргумента h — см. примере In[6].
Подробней о функции Piecewise см. книгу П. Веллина и др. [14, с. 138–139].