Haskell编程:定义生成所有可能整数对排列的函数
解决方案
首先确保导入Data.List中的permutations函数,结合你已实现的number函数,我们可以这样定义possibles:
import Data.List (permutations) -- 你已实现的数字转换函数 number :: [Int] -> Int number digits = foldl (\acc x -> acc * 10 + x) 0 digits -- 你已实现的列表拆分函数(当前问题未直接用到,但保留) splits :: [Int] -> [([Int], [Int])] splits [] = [] splits [x] = [] splits (x : xs) = ([x], xs) : map f (splits xs) where f (z, y) = (x : z, y) -- 目标函数:处理元组列表生成整数对列表 possibles :: [([Int], [Int])] -> [(Int, Int)] possibles = concatMap processPair where processPair (aDigits, bDigits) = [ (number aPerm, number bPerm) | aPerm <- permutations aDigits , bPerm <- permutations bDigits ]
代码解释
permutations的作用:生成输入数字列表的所有可能排列,比如permutations [2,3,4]会返回所有6种3位数字的排列组合。concatMap的作用:遍历输入列表中的每个元组,对每个元组执行processPair处理,最后把所有结果拼接成一个大列表。processPair逻辑:- 对元组的第一个数字列表
aDigits生成所有排列,用number转成整数; - 对元组的第二个数字列表
bDigits生成所有排列,同样转成整数; - 通过列表推导式生成所有可能的整数对组合,覆盖a的每个排列和b的每个排列的配对。
- 对元组的第一个数字列表
验证示例
输入possibles [([1],[2,3,4]),([1,2],[3,4])]会得到:
[(1,234),(1,243),(1,342),(1,324),(1,423),(1,432),(12,34),(12,43),(21,34),(21,43)]
完全符合预期输出。
内容的提问来源于stack exchange,提问作者bobbietinks
相关产品推荐
相关产品推荐

