次のHaskellコードを記述して、n番目の要素が1..nを2進数として記述した場合の1の数であるリストを作成しました(ちなみに、オイラー391に関連しています)。
buildList :: a -> (a -> a) -> [a]
buildList start f = start : buildList (f start) f
differences :: [[Int]]
differences = buildList [0] (\x -> x ++ map (+1) x)
sequenceK' :: Int -> [Int]
sequenceK' n = tail $ scanl (+) 0 (last $ take n differences)
その結果、sequenceK' n
2 ^(n-1)個の要素のリストが表示されます。
この質問には2つの部分があります。
head $ sequenceK' n
a)計算にかかる時間がnとともに増加するのはなぜですか?--ghcの怠惰のため、私は時間がほぼ一定のままであると予想します。
b)このリストの無限バージョンを定義して、渡されたパラメーターの値を気にすることなく、次のようなことができるようtake
にすることは可能ですか?takeWhile
sequenceK'