Feb. 11th, 2008

yorool_gui: (Default)
Понравилось у [livejournal.com profile] deni_ok.
Нужно вычислить вот такую формулу:
f n ( ... (f 3 (f 2 (f 1 x)))) ... )
Первый вариант решения:
chain_bad f n = foldl' (flip (.)) id $ map f [1..n]
Т.е. получить список [ f 1 .. f n ] и свернуть их в последовательность (f n) . (f (n-1)) . ... . (f 1) . id (ну или без id, если взять foldl1')
Плохая, негодная функция получилась - для больших n память переполняется. Засада в том, похоже, что foldl'  форсирует операцию композиции функций (.), а не собственно вычисление f.
И после некоторых размышлений получается окончательный вариант:
chain f n x = foldl' (flip f) x [1 .. n]
Т.е. фактически просто и без наворотов записанная формула из первой строки:  взять x, взять 1, применить к ним f, взять результат, взять 2, применить f, повторять до n.
Вывод: проще нужно быть.

Profile

yorool_gui: (Default)
Michael Ilyin

April 2017

S M T W T F S
      1
2 345678
910 1112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2025 12:04 pm
Powered by Dreamwidth Studios