我有很多清单。简称[[1,2],[3,4]]
。
我需要生成每个元素的符号的所有变化。因此,对于简短的示例,结果将是
[[1,2],[3,4],[-1,2],[1,-2],[-1,-2],[-3,4],[3,-4],[-3,-4]]
是否有执行此操作的程序包?否则我可以使用什么算法? (我承认我对此没有考虑太多...)。
这可以帮助我所有列表的长度相同。
编辑
嗯..也许是这样的想法:
x = [[2*i,2*j] | i <- [1, -1], j <- [-1,1]]
x
[[2,-2],[2,2],[-2,-2],[-2,2]]
最佳答案
该问题可分为2个步骤:
对于给定的数字列表,生成所有可能的符号
对于列表列表,将(1)中的函数应用于每个列表,然后合并结果。
对于1.,您可以编写一个简单的递归函数,该函数首先处理列表的尾部,然后为每个结果组合生成两个符号的两个版本。
signs :: [Int] -> [[Int]]
signs [] = [[]]
signs (x : xs)
= let ps = signs xs
in map (x :) ps ++ map ((-x) :) ps
对于2.,只需将
signs
函数映射到输入,然后将其连接。这是concatMap
函数的作用:signsAll :: [[Int]] -> [[Int]]
signsAll = concatMap signs
关于haskell - 生成所有迹象变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49086884/