IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

いろいろな数列

再帰が難しいので練習として色んな数列を作ってみた

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 の直積を足したものになってしまうのでダメだった。
結局ウェブの例を見ながら理解した