Главная  Длительная эволюция 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [ 55 ] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

Возможно использование функции If с двумя или четырьмя аргументами. Выражение If[test,expr] имеет значением ехрг, если вычисленный test равен True; значением Null, если test равен False, и остается невычисленным в противном случае. Если произошло вычисление на Null, то в выходную ячейку ничего не помещается, и она попросту отсутствует.

Рассмотрим в качестве примера следующую задачу. Пусть для заданного списка, элементами которого являются числа, требуется увеличить их значение на единицу, если элемент меньше 5, и оставить неизменными в противном случае. Эту задачу можно выполнить, например, с помощью следующей программы:

listi =Table[i,{i, 10}];

Do[If[listi[[i]] < 5,listi[[i]] + -i-],{i, 10}];listi {2,3,4,5,5,6,7,8,9,10}

В примере /istl[[t]] + + означает /zstl[[i]] = /istl[[i]] + 1.

Выражение If [test, exprl, ехрг2,ехргЗ] при условии, что тест не принимает ни одного из двух булевых значений, имеет результатом вычисленное ехргЗ. Используем этот вариант функции If для решения усложненной предыдущей задачи. Поставим условие, что если среди элементов списка встречаются нечисловые элементы, то вместо них должно быть поставлено число 0.

12 = Append[listl,{2}];Do[If[12[[i]] <.5,l2[[i]] + +, I2[[i]],l2[[i]] = 0],{i,ll}];l2 {3,4,5,5,5,6,7,8,9,10,0}

Допускается вложенное вхождение функций If, как это демонстрируется в следующем примере:

f[x ] := If[x < 0,0,lf[x < 1,х,1]]

Нами определена функция f[x], равная нулю при i < О, единице при I > 1 и равная х на отрезке от О до 1. Естественно, такое вложенное вхождение можно повторять как угодно большое



число раз, но в „Математике" предусмотрена другая функция, эквивалентная вложенному вхождению If. Условная функция

Which[testl, exprl, test2,expr2,...]

имеет четное число 2п аргументов, среди которых п тестов testi и п выражений expri. При этом вычисляется первое из expri, для которого стоящий перед ним testi равен True. Если первые к тестов равны False, а Ar + 1-й имеет небулево значение, то вся функция с заголовком Which остается невычисленной.

{Which[3 > 7,х,5 > 7,у,9 > 7,z], Which[3 > 7,х,а > 7,у,9 > 7,z]} {z, Which[i > 7,1, а > 7, у, 9 > 7,2]}

В случае, когда все тесты вычисляются на False, значение введенного выражения с заголовком Which равно Null. Иногда бывает удобно вместо результата Null помещать в выходную ячейку какое-то сообщение, позволяющее судить, что имеет место рассматриваемая ситуация с тестами. Для этого последним тестом делается True, а следующим за ним выражением делается сообщение.

Which[3 > 5,х,4 > 5,у,True,"Fail"] Fail

В качестве примера применения функции Which, определим функцию, которая по координатам точки М на плоскости определяла бы, в каком из четырех квадрантов находится эта точка. Для простоты будем считать, что М не лежит на координатных осях.

quadrant[{x.,y-}] := Which[x > О && у > 0,1,

X < О && у > 0,2,х < О && у < 0,3,х > О && у < 0,4]

{quadrant[{-3,5}],quadrant[{2,-7}],quadrant[{-3,-l}],

quadrant[{l,5}]}

{2,4,3,1}



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

Switch[expr, patternl, exprl, patter п2, ехрг2,...]

проверяется соответствие вычисленного выражения ехрг шаг блонам patterni. Если patternk первый шаблон, которому оно соответствует, то результатом вычисления рассматриваемой функции будет вычисленное выражение ехргк. При несоответствии ни одному шаблону, вычисление с заголовком Switch помещается в выходную ячейку невычисленным. Однако если последний шаблон равен , то результатом будет вычисленное последнее выражение ехргп.

Рассмотрим в качестве примера программу norm, которая нормализует списки по длине, превращая любой непустой список в список длины 5, в соответствии со следующим правилом. Если длина списка меньше пяти, то в его конец добавляются нули, если больше пяти, то лишние элементы в конце списка удаляются. Пустой список остается неизменным. ЕЗсли на входе программы оказывается выражение, не являющееся списком, то выдается сообщение input is not а list.

Set Attributes[norm, Hold All] norm[l ] :=

Switch[l,-List,Which[Length[l] == 0

Length[l] == 5,l,Length[l] < 5,

Do[l = Append[l,0], {5 - Lengthffl}];

l,Length[l] > 5,Do[l = Delete[l, -l], {Length[l] - 5}];

1], ,"input is not a list"]

Мы снабдили функцию norm атрибутом HoldAll для того, чтобы ее аргумент не вычислялся раньше, чем будет использовано



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [ 55 ] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

0.0009