RosettaCodeData/Task/Hofstadter-Q-sequence/Haskell/hofstadter-q-sequence-2.hs
Ingy döt Net db842d013d A-M baby
2013-04-10 21:29:02 -07:00

21 lines
771 B
Haskell

import Data.Array
qSequence n = arr
where
arr = listArray (1,n) $ 1:1: map g [3..n]
g i = arr!(i - arr!(i-1)) +
arr!(i - arr!(i-2))
gradualth m k arr -- gradually precalculate m-th item
| m <= v = pre `seq` arr!m -- in steps of k
where -- to prevent STACK OVERFLOW
pre = foldl1 (\a b-> a `seq` arr!b) [u,u+k..m]
(u,v) = bounds arr
qSeqTest m n = let arr = qSequence $ max m n in
( take 10 . elems $ arr -- 10 first items
, gradualth m 10000 $ arr -- m-th item
, length . filter (> 0) -- reversals in n items
. _S (zipWith (-)) tail . take n . elems $ arr )
_S f g x = f x (g x)