【发布时间】:2016-09-26 00:42:56
【问题描述】:
我有一个问题。我想生成二进制列表。但是列表成员之间只会有一点变化。
oneBitAll :: Integral a => a -> [[String]]
对于 n=2
输出:
["00","01","11","10"] ve ["00","10","11","01"]
n=3
oneBitAll 3
[["000","001","011","010","110","111","101","100"], ["000","001","011","111 ","101","100","110","010"], ["000","001","101","100","110","111","011","010 "], ["000","001","101","111","011","010","110","100"], ["000","010","011", "001","101","111","110","100"],.....]
成员之间只有一点变化。
请帮忙。
这只给出一个
g 0 = [""]
g n = (map ('0':)) (g (n-1)) ++ (map ('1':)) (reverse (g (n-1)))
灰色代码是正确的。但我想找到所有组合。
如何为给定的 n 数生成所有可能的格雷码?
permute [] = [[]]
permute xs = concatMap (\x -> map (x:) $ permute $ delete x xs) xs
g 0 = [""]
g n = (map ('0':)) (g (n-1)) ++ (map ('1':)) (reverse (g (n-1)))
oneBitAll n = (map transpose . permute . transpose $ g n)
这个代码产生了一半的可能性。我可以添加这个代码什么?这个代码产生;
[["000","001","011","010","110","111","101","100"],["000","010","011" ,"001","101","111","110","100"],["000","001","101","100","110","111","011" ,"010"],["000","010","110","100","101","111","011","001"],["000","100"," 101","001","011","111","110","010"],["000","100","110","010","011","111"," 101","001"]]
但必须生成 12 个成员。
【问题讨论】:
-
难题?我该怎么办?
-
谷歌“格雷码”
-
谢谢,但这将提供一切可能吗?
-
我认为他在问什么很清楚,尽管通读明显的英语作为第二语言的问题需要一些思考:如何枚举所有的格雷码给定长度? (或者,等效地,如何枚举 n 维立方体上的所有哈密顿循环?)所以我不会像其他人那样投票结束“不清楚你在问什么”。
-
好吧 - OP 在几分钟前编辑了这个问题并添加了他的解决方案 - 我发表评论时没有看到的函数
g。