【发布时间】:2014-04-29 18:15:12
【问题描述】:
如何实现一个包含 k one 和 0 zero 的列表列表,以及带有 的列表>k-1 one 和 1 zero, ... , 0 one 和 k zero 在 Haskell 中以便可以懒惰地检索它们?
例如,如果 k=3:
generate_list 3 = [[1,1,1],[0,1,1],[1,0,1],[1,1,0],[0,0,1],[0,1,0],[1,0,0],[0,0,0]]
感谢bheklilr 的建议。这是我的解决方案:
generate k = take (2^k) $ foldl (\x y -> zipWith (:) y x) (map (\x->[x]) (head rows)) (tail rows)
where
rows = map cycle $ map pattern [0..k-1]
pattern i = replicate (2^i) 1 ++ replicate (2^i) 0
但是有一个问题:
generate_list 3 = [[1,1,1], [0,1,1], [1,0,1], [1,1,0], [0,0,1], [0,1,0], [1,0,0], [0,0,0]]
generate 3 = [[1,1,1], [1,1,0], [1,0,1], [1,0,0], [0,1,1], [0,1,0], [0,0,1], [0,0,0]]
generate 3 !! 3 = [1,0,0] - it contains 1 one
generate_list 3 !! 3 = [1,1,0] - it contain 2 one
所以对于我在generate_list 中的任务顺序,输出顺序很重要,[1,1,0] 必须在[1,0,0] 之前。
【问题讨论】:
-
到目前为止你做了什么?您能否展示您尝试过的任何代码,或者甚至说出您尝试过使用的库,例如
Data.List? -
您是否考虑过这与建立truth table 的关系?有一个非常简单的算法可以手动填写,你怎么把它变成代码?
-
我想生成反向列表。如果我建立一个真值表并将其反转,我就会失去懒惰。
-
如果你把真值表倒过来怎么办?
标签: list haskell binary lazy-evaluation