На этом шаге мы рассмотрим понятие итерации и соответствующий функционал.
f1(x)=f(x), f2(x)=f(f1(x)), f3(x)=f(f2(x)),...,fn(x)=f(fn-1(x)).
Если f(x)=xα, то получаем
2 2 3 n-1 n f2(x)=(xα)α=xα, f3(x)=(xα )α =xα ,...,fn(x)=(xα )α=xα ,...
Для некоторых классов функций можно определить итерации с произвольным действительным и даже комплексным показателем.
Функционал, применяющий функцию, заданную первым аргументом ко второму аргументу и возвращающий потенциально бесконечный список результатов применений
[x,f(x),f(f(x)),f(f(f(x))),...]
iterate:: (a -> a) -> a -> [a] iterate f x
> iterate sqrt 256 [256.0,16.0,4.0,2.0,1.4142135623731,1.18920711500272,...]
В заключение приведем небольшой пример.
-- Демонстрация использования функционала iterate, который -- формирует потенциально бесконечный список вида -- -- [x, sqrt x, sqrt(sqrt x)), sqrt(sqrt(sqrt x))),...] -- ***************************************************** -- Функция f, возвращающая значение квадратного корня из -- вещественного числа x0; итерации продолжаются, пока -- в списке итераций не будет получено число, меньшее e ------------------------------------------------------- f:: Float -> Float -> Int -> (Float,Int) f x0 e i | (s !! i)>e = f x0 e (i+1) | True = (s !! i,i) where s = iterate sqrt x0 ---------------------------------- f1:: Float -> Float -> (Float,Int) f1 x0 e = (last s,length s) where s = takeWhile (\x -> x>e) (iterate sqrt x0) -- **************************************************** -- Неудачные тестовые примеры: ------------------------------ test1 = f 36 1.0006 0 test2 = f1 36 1.0006
На следующем шаге мы рассмотрим функционал для организации циклических процессов.