再帰が難しいので練習として色んな数列を作ってみた
main = do putStrLn $ j $ take 8 $ s1 0 1 putStrLn $ j $ take 8 $ s2 1 2 putStrLn $ j $ take 8 $ s3 putStrLn $ j $ take 8 $ s4 0 (+1) putStrLn $ j $ take 8 $ s4 1 (*2) putStrLn $ j $ take 8 $ s4 1.01 (\x -> x * x) putStrLn $ j $ take 8 $ s5 s3 -- 黄金比の導出 -- join j [] = "" j (x:xs) = show x ++ ", " ++ j xs -- 等比数列 s1 x n = x : map (+n) (s1 x n) -- 等倍数列 s2 x n = x : map (*n) (s2 x n) -- フィボナッチ数列 s3 = 1 : 1 : [ a + b | (a, b) <- zip s3 (tail s3) ] -- 式を与える数列 s4 x f = x : map f (s4 x f) -- 数式の差を数式にする s5 (x:xs) = (head xs / x) : s5 xs
フィボナッチ数列を理解するのがかなり苦労した
最初に書いたコード
s3 = 1 : 1 : [a + b | a <- s3, b <- tail s3 ]
これだと [] の中が s3 と tail s3 の直積を足したものになってしまうのでダメだった。
結局ウェブの例を見ながら理解した