Mir*_*lov 2 haskell combinatorics
如果X是一组数字,然后?X是一个多集的数字,表示每个2号之间的成对减法.例如,如果X一行中的一组点按递增顺序排列,那么?X这些点之间的成对距离是多重的.如何编写一个返回数字列表的成对距离的函数?以下工作,但我想要一个更优雅的解决方案.请包括理论或直觉,如果可能的话,可以提供有关如何解决类似问题的见解.
pairwise_distances :: [Int] -> [Int]
pairwise_distances [] = []
pairwise_distances [x] = []
pairwise_distances (x:xs) = sort $ map (abs . (x-)) xs ++ pairwise_distances xs
pairwise_distances [3,2,1] -- [1,1,2]
pairwise_distances [0,2,4,7,10] -- [2,2,3,3,4,5,6,7,8,10]
Run Code Online (Sandbox Code Playgroud)
Cha*_*oft 10
distances xs = sort [ y - x | (x:ys) <- tails (sort xs), y <- ys ]
Run Code Online (Sandbox Code Playgroud)
直觉:想法是生成所有不同元素对xs.每个元素在列表中都有一些位置.如果我们在列表x之前采取行动y,那么x就是列表尾部的头部,并且y位于尾部尾部的某个位置.如果你xs先排序,那么y >= x.你可以采取abs (y-x)最后而不是排序xs.