加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中生成一组集的功率集

发布时间:2020-12-16 09:30:50 所属栏目:安全 来源:网络整理
导读:我有一些类型的项目,并希望生成其功率集。 我在网上搜索,找不到适合这个特定任务的任何Scala代码。 这是我想出来的。它允许您限制由length参数生成的集合的基数。 def power[T](set: Set[T],length: Int) = { var res = Set[Set[T]]() res ++= set.map(Set
我有一些类型的项目,并希望生成其功率集。

我在网上搜索,找不到适合这个特定任务的任何Scala代码。

这是我想出来的。它允许您限制由length参数生成的集合的基数。

def power[T](set: Set[T],length: Int) = {
   var res = Set[Set[T]]()
   res ++= set.map(Set(_))

   for (i <- 1 until length)
      res = res.map(x => set.map(x + _)).flatten

   res
   }

这不包括空集。要完成这个,你将不得不将该方法的最后一行改为res Set()

有什么建议,可以如何实现更有功能的风格?

解决方法

注意,如果你有一个集合S和另一个集合T,其中T = S∪{x}(即,T是具有一个元素的S,那么T-P(T)的幂组可以用P(S )和x如下:

P(T) = P(S) ∪ { p ∪ {x} | p ∈ P(S) }

也就是说,你可以递归地定义poweret(注意这是如何给你免费的poweret的大小 – 即添加1元素将poweret的大小加倍)。因此,您可以在scala中以递归方式执行以下操作:

scala> def power[A](t: Set[A]): Set[Set[A]] = {
   |     @annotation.tailrec 
   |     def pwr(t: Set[A],ps: Set[Set[A]]): Set[Set[A]] =
   |       if (t.isEmpty) ps
   |       else pwr(t.tail,ps ++ (ps map (_ + t.head)))
   |
   |     pwr(t,Set(Set.empty[A])) //Powerset of ? is {?}
   |   }
power: [A](t: Set[A])Set[Set[A]]

然后:

scala> power(Set(1,2,3))
res2: Set[Set[Int]] = Set(Set(1,3),Set(2,Set(),Set(3),Set(2),Set(1),Set(1,2))

它实际上看起来更好做同样的List(即递归ADT):

scala> def power[A](s: List[A]): List[List[A]] = {
   |     @annotation.tailrec 
   |     def pwr(s: List[A],acc: List[List[A]]): List[List[A]] = s match {
   |       case Nil     => acc 
   |       case a :: as => pwr(as,acc ::: (acc map (a :: _)))
   |     }
   |     pwr(s,Nil :: Nil)
   |   }
power: [A](s: List[A])List[List[A]]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读