来个Clojure的:
(defn combines
"得到集合coll的所有组合
算法:'[a b e f]的组合就是0001~1111的所有二进制数对应的组合(该位为1就是选
取,为0就是不选)"
[coll]
(let [N (count coll)
upp (bit-shift-left 1 N) ; 上界,如[a b c d] 是 16
c1 (fn [n] (for [i (range N) :when (bit-test n i)] (nth coll i))) ;
根据数字得到一个组合 2r1001 -> [a d]
]
(map c1 (range 1 upp))))
=> (combines '[a b c d])
((a) (b) (a b) (c) (a c) (b c) (a b c) (d) (a d) (b d) (a b d) (c d) (a c d) (b c d) (a b c d))
【 在 xWvxYWYxvWx 的大作中提到: 】
: 标 题: Re: 这种组合算法怎么写?
: 发信站: 水木社区 (Fri May 31 01:13:11 2024), 站内 [累计积分奖励: 100/0]
:
: 凑个热闹,贡献个 Scala 的一行版本:
:
: def fullCombination[A](in: List[A]): List[List[A]] = in.foldLeft(List(List.empty[A])) { (acc, x) => acc ++ acc.map(x :: _) }.collect { case xs if xs.nonEmpty => xs.reverse }
:
:
: // 测试
:
: scala> fullCombination(List('a', 'b', 'c', 'd')).map(_.mkString).mkString(", ")
: val res5: String = a, b, ab, c, ac, bc, abc, d, ad, bd, abd, cd, acd, bcd, abcd
:
: scala> fullCombination(List(1,2,3))
: val res6: List[List[Int]] = List(List(1), List(2), List(1, 2), List(3), List(1, 3), List(2, 3), List(1, 2, 3))
:
: 【 在 iStudy 的大作中提到: 】
: : 标 题: 这种组合算法怎么写?
: : 发信站: 水木社区 (Tue May 28 19:10:33 2024), 站内
: :
: : a,b,c,d四个对象
: :
: : 我要生成a,b,c,d的全组合===C(4,1)+C(4,2)+C(4,3)+C(4,4)
: :
: : 结果就是输出 {a,b,c,d, ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd}
: :
: : 这种算法很常见,java有类似的库吗?
: :
: : --
: :
: : ※ 修改:·iStudy 于 May 28 19:15:08 2024 修改本文·[FROM: 58.37.127.*]
: : ※ 来源:·水木社区 mysmth.net·[FROM: 58.37.127.*]
:
: --
:
: ※ 修改:·xWvxYWYxvWx 于 May 31 01:15:59 2024 修改本文·[FROM: 14.112.12.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 14.112.12.*]
--
修改:iStudy FROM 58.37.127.*
FROM 61.49.161.*