我编写了以下 Haskell 代码来生成一个列表,其中第 n 个元素是 1 的个数,将 1..n 写为二进制数(顺便说一下,它与 euler 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) 个元素的列表。
这个问题有两个部分:
a) 为什么计算所需的时间head $ sequenceK' n
会随着 n 的增加而增加?- 由于 ghc 的懒惰,我希望时间或多或少保持不变。
b)是否可以定义此列表的无限版本,以便我可以做类似的事情take
而takeWhile
不必担心传递给的参数的值sequenceK'
?