Иллюстрированный самоучитель по Mathematica 3/4

Суперпозиция функций. Функции Fixed Point и Catch.

При функциональном программировании часто используется суперпозиция функций. Для ее реализации используются следующие функции:

  • Nest [expr, x, n] – n раз применяет выражение (функцию) ехрг к заданному аргументу х,
  • NestList [f, x, n] – возвращает список результатов (п+1)-кратного применения функции f к заданному аргументу х;
  • Fold[f, x, list] – дает последний элемент в FoldList [f, x, list];
  • FoldList [f, x, {a,b,…} ] – возвращает список {x,f [x,a],f [f [x,a],b],…};
  • ComposeList [ { f, f,…}, x] – генерирует список в форме {х,а[х],а[а[х] ],…}.

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

Nest[f, x, 5]
f[f[f[f[f[x]]]]]
  
Nest[Exp[x], x, 5]
Ex[Ex[Ex[Ex[Ex[x]]]]]
  
NestList[f, x, 3]
{x, f[x], f[f[x]], f[f[f[x]]]}
  
Fold[f, x, (-1, 2, 3}]
f[f[f[x, 1], 2], 3]
  
FoldList[f, x, {1, 2, 3}]
{x, f[x, 1], f[f[x, 1], 2], f[f[f{x, 1], 2], 3]}
  
ComposeList[{Exp, Ln, Sin), x]
{x, Ex, Ln[Ex], SinlLn[Ex]] ]}

Функции Fixed Point и Catch

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

  • FixedPoint [ f, expr ] – вычисляет expr и применяет к нему f, пока результат не перестанет изменяться;
  • FixedPoint [ f, expr, SameTest › comp] – вычисляет expr и применяет к нему f, пока два последовательных результата не дадут True в тесте SameTest.

Пример применения функции FixedPoint:

FixedPoint[Function[t, Print[t]; Floor[t / 2]], 27]
27
13
6
3
1
0
0

Последний результат (ноль) выводится в отдельной (нумерованной) ячейке вывода и означает завершение процесса итераций – деления t на 2.

Следующий пример показывает, как можно создать цепную дробь с помощью функции Nest:

Nest[Functiontt, 1 / (1 + t)], y, 3]
1 / (1 / (1 / ((1 + y) + 1) + 1) + 1)

Еще одна функция такого рода – это Catch:

  • Catch [expr] – вычисляет expr, пока не встретится Throw [value], затем возвращает value;
  • Catch [expr, form] – вычисляет expr, пока не встретится Throw [value, tag], затем возвращает value;
  • Catch [expr, form, f] – возвращает f [value, tag] вместо value.

Ниже представлены некоторые конструкции циклов с оператором Catch:

Catch[ x, a, f ]
x
  
Catch[ Throw[ x, y ], y, fun ]
fun[x, y]
  
Catch[ NestList[l/(# + 1)&, -3, 5] ]
{-3,-1/2, 2, 1/3, 3/4, 4/7}
  
Catch[ NestList[l/(# + 1)&, -3., 5] ]
{-3., - 0.5, 2., 0.333333, 0.75, 0.571429}
  
Catch[Do[Print[i]; If[i > 4, Throw[i+2]], i, 10]]
1
2
3
4
5
7
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.