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

java – 递归生成功率集而不带任何循环

发布时间:2020-12-15 02:47:45 所属栏目:Java 来源:网络整理
导读:你如何编写一个递归方法PowerSet(字符串输入)打印出传递给它的字符串的所有可能组合? 例如:PowerSet(“abc”)将打印出abc,ab,ac,bc,a,b,c 我已经看到一些带循环的递归解决方案,但在这种情况下不允许循环. 有任何想法吗? 编辑:所需方法只有一个参数,即字
你如何编写一个递归方法PowerSet(字符串输入)打印出传递给它的字符串的所有可能组合?

例如:PowerSet(“abc”)将打印出abc,ab,ac,bc,a,b,c

我已经看到一些带循环的递归解决方案,但在这种情况下不允许循环.

有任何想法吗?

编辑:所需方法只有一个参数,即字符串输入.

解决方法

abcd的powerset是abc,abd,acd(加上set abcd本身*)的幂集的联合.
P(`abcd`) = {`abcd`} + P(`abc`) + P(`abd`) + P(`acd`) + P(`bcd`)

*注意,作为P(abcd)成员的空集也是P(abc),P(abd)的成员,……因此上述等价成立.

递归地,P(abc)= {abc} P(ab)P(ac),依此类推

伪代码的第一种方法可以是:

powerset(string) {
  add string to set;
  for each char in string {
   let substring = string excluding char,add powerset(substring) to set
  }
  return set;      
}

当字符串为空时递归结束(因为它从不进入循环).

如果你真的不想要循环,你必须将该循环转换为另一个递归.
现在我们要从abc生成ab,ac和cb

powerset(string) {
  add string to set;
  add powerset2(string,0) to set;
  return set
}

powerset2(string,pos) {
  if pos<length(string) then
    let substring = (string excluding the char at pos)
    add powerset(substring) to set
    add powerset2(string,pos+1) to set
  else 
    add "" to set
  endif
  return set
}

另一种方法实现递归函数P,该函数P从其参数中移除第一个字符,或者不移除. (这里表示set union,.表示连接,λ表示空字符串)

P(abcd) = P(bcd) + a.P(bcd)
P(bcd)  = P(cd)  + b.P(cd)
P(cd)   = P(d)   + c.P(d)
P(d)    = λ+d //particular case

然后

P(d)    = λ+d
R(cd)   = P(d)  + c.P(d)  = λ + d + c.(λ+d) = λ + d + c + cd
R(bcd)  = P(cd) + b.P(cd) = λ + d + c + cd + b.(λ + d + c + cd)
                          = λ + d + c + cd + b + bd + bc + bcd
P(abcd) =  λ +  d +  c +  cd +  b +  bd +  bc +  bcd 
        + aλ + ad + ac + acd + ab + abd + abc + abcd

如果允许循环,则P退出功率设置功能.否则,我们需要一个单参数无循环函数来将给定字符连接到给定的字符串集(显然这是两件事).

通过使用String.replace可以实现一些调整(如果需要String结果,或者通过将List替换为List(以便“附加”参数实际上是列表中的第一个元素).

(编辑:李大同)

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

    推荐文章
      热点阅读