当前位置: 首页 > 知识库问答 >
问题:

Java中的递归-打印字符串排列

邹齐智
2023-03-14

我试图编写一个方法,使用递归打印字符串的所有排列。现在,我有这样的代码:

private static void printPermutations(String in, String out) {
    if (in.length() == 0) System.out.println(out);
    else {
        for (int i = 0 ; i < in.length() ; i++) {
        printPermutations(in.substring(0, i) + in.substring(i + 1), out + in.charAt(i));
    }
    }
}

它打印出正确的结果,但我试图在不使用循环的情况下解决它,包括第4行中的循环。可能吗?如果是这样,你会如何解决?非常感谢。

我试图添加第三个名为index的参数,并在第5行的递归调用中写入index 1,但没有成功。我认为添加第三个参数是个好主意,我只是不知道如何使用它。

共有1个答案

别开诚
2023-03-14

所以我不知道你为什么要这样做...这是你为递归所做的设置,你需要不返回无效,否则它不是真正的递归。w3学校是一个很好的资源。

 public class Main {
  public static void main(String[] args) {
    int result = sum(10);
    System.out.println(result);
  }
  public static int sum(int k) {
    if (k > 0) {
      return k + sum(k - 1);
    } else {
      return 0;
    }
  }
}

这将返回类似于

10 + sum(9)
10 + ( 9 + sum(8) )
10 + ( 9 + ( 8 + sum(7) ) )
...
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum(0)
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0 

我希望这能帮助你把你需要的东西放在一起。你必须有一个返回,这样递归方法才能看到它以前的调用,它就像橡胶带一样接收信息,一旦它到达某个点,它就会返回你所有的迭代。就我个人而言,我更喜欢循环,更容易阅读和编码。

您正在尝试做的一个实现是:

public class Main {
  public static void main(String[] args) {
    String result = Variations("test");
    System.out.println(result);
  }
  public static String Variations(String k) {
    if (k.length() > 0) {
      return k + k.substring(0, k.lenth() - 1);
    } else {
      return "";
    }
  }
}

我相信这将是你想做的事情的变化。

 类似资料:
  • 我正在编写一段代码,用于递归地只打印字符串的字典序较大的子字符串。 代码运行良好。我在这里所做的是递归生成所有子字符串,并同时将它们插入ArrayList。后来对该列表进行排序,比较字符串,瞧,就这样完成了。 现在困扰我的是这个程序的复杂性。在这里,我生成所有的子字符串,然后从中进行选择。对于递归,我觉得这是一个自动化的过程,所有的子字符串都必须至少创建或访问一次。所以,在这一点上,我想问一下这是

  • 我想按以下顺序打印子字符串:-“”,“D”,“C”,“CD”,“B”,“BD”,“BC”,“BCD”,“A”,“AD”,“AC”,“ACD”,“AB”,“ABD”,“ABC”,“ABCD” 在这里,最后4个阵型的“a”不见了

  • 问题内容: 我想在同一行上打印列表中的项目。我尝试过的代码: 输出= 我想输出到= 此代码仍在新行上打印我的模具的ASCII艺术表示。我想将其打印在同一行上,以节省空间并在一个屏幕上显示每个玩家的状态。 问题答案: 由于的元素是多行字符串,因此要比这更难。 首先,从每个字符串的开头删除换行符,并确保ASCII图形中的所有行都具有相同的长度。 然后尝试以下 如果您将描述的更改应用于ASCII艺术作品

  • 问题内容: 我正在编写一个程序,该程序将以字符串形式输出唯一字符(通过扫描仪输入)。我创建了一个方法来尝试实现此目的,但我一直在获取不重复的字符,而不是字符串中唯一的一个(或多个)字符。我只想要唯一的字母。 这是我的代码: 这是上面代码的示例输出: 预期的输出将是: 问题答案: 根据所需的输出,当以后重复时,必须替换最初已经添加的字符,因此:

  • 本文向大家介绍打印给定字符串的所有排列,包括了打印给定字符串的所有排列的使用技巧和注意事项,需要的朋友参考一下 打印给定字符串的所有排列是回溯问题的一个示例。我们将减小子字符串的大小以解决子问题,然后再次回溯以从该部分获得另一个排列。 例如,如果字符串是ABC,则所有排列将是ABC,ACB,BAC,BCA,CAB,CBA。 该算法的复杂度为O(n!)。这是一个巨大的复杂性。当字符串大小增加时,需要

  • 12.3. Display,一个递归的值打印器 接下来,让我们看看如何改善聚合数据类型的显示。我们并不想完全克隆一个fmt.Sprint函数,我们只是构建一个用于调试用的Display函数:给定任意一个复杂类型 x,打印这个值对应的完整结构,同时标记每个元素的发现路径。让我们从一个例子开始。 e, _ := eval.Parse("sqrt(A / pi)") Display("e", e) 在