Суперпозиция функций. Функции 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] 271363100Последний результат (ноль) выводится в отдельной (нумерованной) ячейке вывода и означает завершение процесса итераций – деления 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]] 123457