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

[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]

Глава 5

ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ

5.1. Функции, определяемые пользователем

В „Математике" около тысячи встроенных функций. Однако после определенного числа сеансов работы с ней пользователь начинает замечать, что при проведении расчетов в интересующей его области определенные комбинации встроенных функций повторяются, и неплохо было бы поэтому последовательное применение нескольких встроенных функций заменить применением одной. Это простое замечание и лежит, в сущности, в основе функционального программирования, в котором функции применяются к аргументам, затем другие функции применяются к функциям от аргументов, затем новые функции применяются к функциям от функций от аргументов и т.д. Помимо встроенных функций пользователю могут понадобиться совсем простые функции, типа возведения аргумента в куб, отсутствующие среди встроенных функций.

Самое простое, что приходит в голову при попытке определить функцию f{x) = х, - это присвоить выражению cube[x] значение хЗ:

cube[x] = хЗ

Прием, когда вместо невыразительного заголовка / для функций используется заголовок, несущий информацию о ее назначении, является довольно обычным, поэтому мы и выбрали за-



5.1. функции, определяемые пользователем 127

головок cube для рассматриваемой функции. Ек:ли попытаться вычислить значения функции cube для аргумента 2 или аргумента у, то ожидаемых результатов 8 или уне получится.

{cube[2], cube[y], cube[x]}

{cube[2], cube[y], x}

Вычисление произошло только для аргумента х, и все дело в том, что пользователь склонен рассматривать х как переменную, пробегающую по области определения функции, в то время как для „Математики" х - это фиксированный символ. Выражения си&€[а;] и сиб€[у] отличны друг от друга, поэтому если вместо первого выражения всюду в дальнейшем будет подставляться а;, то второе выражен!» будет оставаться неизменным, в чем мы, собственно, и убедились.

Существует способ объяснить „Математике", что в квадратных скобках после заголовка cube стоит переменная. Для этого нужно вместе с символом х употребить выражение В1апк[], которое во входном формате совпадает с подчеркиванием :

cube[x ] := х3

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

{cube[2], cube[y], cube[x]}

{8,yxЗ}

Есть еще два способа указать „Математике", что некоторое выражение следует рассматривать как функцию определенных



переменных. С ними мы уже встречались в предыдущих главах. Вспомним, что типичные операторы математического анализа: дифференцирование, и интегрирование - можно было применять к произвольным выражениям ехрг. По каким переменным ехрг рассматривается как функция, указывалось заданием второго, третьего и т.д. аргументов:

D[a х-г + Ь у,а].

Аналогично обстояло дело и с графическими функциями Plot, ParametricPlot и т.п. Второй способ: с помощью функции ReplaceAU мы могли вычислять значение выражения для отдельных символьных, численных и других значений входящего в выражение символа, тем самым проделывая типичные для функций процедуры подстановки конкретных значений аргумента или суперпозиции функций.

а х"2--Ь у /. х->2 4а + Ьу

Теперь мы можем сделать из выражения ехрг = ах + by традиционную функцию двух аргументов х и у, рассматривая символы а и Ь как параметры:

ро1у[х ,у ] :=а х"2--Ь у {D[poly[x,y],y], ро1у[2,у]} {Ь, 4а + Ьу}

В качестве еще одного примера определим очень простую функцию для работы над списками с численными элементами, а именно функцию, вычисляющую среднее арифметическое списка:

average[x ] := Apply [Plus, x]/Length[x]

average[{l3,7,16}]



[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.0012