当前位置: 首页 > 面试题库 >

递归生成功率集,没有任何循环

龙哲
2023-03-14
问题内容

如何编写一个递归方法PowerSet(字符串输入),该方法打印出传递给它的字符串的所有可能组合?

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

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

有任何想法吗?

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


问题答案:

的幂abcd为动力的集合的并集abcabdacd(加上集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;      
}

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

如果你真的想 循环,你将不得不到循环转换为另一种递归。现在,我们要生成abaccbabc

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(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结果,或通过替换进行调整,SetList使“其他”参数实际上是列表中的第一个元素)。



 类似资料:
  • 问题内容: 我正在尝试使用 生成器 在Python中构建给定集合的子集列表。说我有 作为输入,我应该有 作为输出。我该如何实现? 问题答案: 最快的方法是使用itertools,尤其是链和组合: 如果需要生成器,只需使用yield并将元组变成集合: 然后简单地:

  • 我已经用蓝鸟学习promise两周了。我已经基本理解了它们,但是我去解决了一些相关的问题,似乎我的知识已经崩溃了。我试着做这个简单的代码: 作为一个具体例子: 现在我已经做了作业!还有同样的问题,但在这里面向Q. js: 为promise编写循环的正确方法。 但是接受的答案,以及其他答案: 面向Q.js或RSVP 针对bluebird的唯一答案是使用递归。这些看起来很可能会在无限循环(比如我的循环

  • 本文向大家介绍c#递归生成XML实例,包括了c#递归生成XML实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了c#递归生成XML的方法。分享给大家供大家参考。具体实现方法如下: 这里结合网上搜到的资料,写了个递归生成xml,经过调试可以使用,数据库结构如下图所示: 代码如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我天真地尝试创建一个递归生成器。没用 这是我所做的: 我所得到的只是第一项。 有没有办法使这种代码起作用?本质上是在递归方案中将命令转移到以上级别吗? 问题答案: 尝试这个: 我应该指出,由于您的功能存在错误,因此无法使用。它可能应该包含不为空的支票,如下所示:

  • 给定目标金额和硬币面额列表,我的代码应该找到达到目标金额所需的最少硬币。 示例: > 我们可以从3x253x1做78,所以需要6个硬币 48=2x24,因此2枚硬币就足够了 我们可以从2x161x3中得到35,所以3个硬币就足够了 我用for循环编写了代码,但如何使其递归?

  • 问题内容: 这是我的代码。我正在尝试使用箭头键使球移动。当我运行上述程序时 ,不显示球 ( 如果我将坐标更改为显示0,30球), 并且事件未触发,球既不移动也不跳跃 ? 问题答案:

  • 我有一个递归算法,我用它来迭代分层数据结构,但不幸的是,对于一些数据,分层结构太深,以至于我得到了一个StackOverflow错误。我见过这种情况发生在大约150个节点的深度上,而数据可能会增长到更远的程度。对于上下文,这段代码将在有限的环境中运行,改变JVM堆栈大小不是一个选项,数据结构是给定的,代表不同的文件系统和目录和文件。 为了解决堆栈溢出问题,我尝试将算法转换为迭代算法。这不是我以前必