import Data.List (mapAccumL) feigenbaumApprox :: Int -> [Double] feigenbaumApprox mx = snd $ mitch mx 10 where mitch :: Int -> Int -> ((Double, Double, Double), [Double]) mitch mx mxj = mapAccumL (\(a1, a2, d1) i -> let a = iterate (\a -> let (x, y) = iterate (\(x, y) -> (a - (x * x), 1.0 - ((2.0 * x) * y))) (0.0, 0.0) !! (2 ^ i) in a - (x / y)) (a1 + (a1 - a2) / d1) !! mxj d = (a1 - a2) / (a - a1) in ((a, a1, d), d)) (1.0, 0.0, 3.2) [2 .. (1 + mx)] -- TEST ------------------------------------------------------------------ main :: IO () main = (putStrLn . unlines) $ zipWith (\i s -> justifyRight 2 ' ' (show i) ++ '\t' : s) [1 ..] (show <$> feigenbaumApprox 13) where justifyRight n c s = drop (length s) (replicate n c ++ s)