Суперпозиция функций. Функции 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