Java 在字符串中生成字符组合不需要';我不能完全工作,为什么?

Java 在字符串中生成字符组合不需要';我不能完全工作,为什么?,java,string,recursion,combinations,Java,String,Recursion,Combinations,我试图生成字符串中所有字符的组合。第一个参数是给定的字符串,第二个参数是字母数。因此,组合(“ab”,2)应该给我aa,ab,ba,bb,组合(“abc”,2)应该给我aa,ab,ac,ba,bb,bc,ca,cb,cc,等等 在第一种情况下,我的当前代码给出了aa、ab、bb(因此它跳过ba)。 这是我的代码: public static void combinations(String s, int n) { combinations(

我试图生成字符串中所有字符的组合。第一个参数是给定的字符串,第二个参数是字母数。因此,
组合(“ab”,2)
应该给我
aa,ab,ba,bb
组合(“abc”,2)
应该给我
aa,ab,ac,ba,bb,bc,ca,cb,cc
,等等

在第一种情况下,我的当前代码给出了
aa、ab、bb
(因此它跳过
ba
)。 这是我的代码:

        public static void combinations(String s, int n)
        {
            combinations(s,"",n);
        }


        public static void combinations(String s, String prfx, int n)
        {
            if(n == 0)
            {
                System.out.println(prfx);
            }

            else
            {
                for(int i = 0; i < s.length(); i++)
                {
                    combinations(s.substring(i), prfx + s.charAt(i), n-1);

                }
            }
        }
公共静态无效组合(字符串s,int n)
{
组合(s,“,n);
}
公共静态无效组合(字符串s、字符串prfx、整数n)
{
如果(n==0)
{
系统输出打印项次(prfx);
}
其他的
{
对于(int i=0;i

我做错了什么?如果你不只是给我一个正确的答案,还要给我一些解释,让我从中学习,我将不胜感激,因为我不太擅长递归。谢谢。

问题的根源在于:

  combinations(s.substring(i), prfx + s.charAt(i), n-1);
               ^^^^^^^^^^^^^^
您希望循环遍历字符串中的字符,并依次使用每个字符作为前缀,然后进行递归调用以构建字符串其余部分的组合。但是,如果只将原始字符串的子字符串传递到递归调用中,则不会生成所有可能的置换。在上面的例子中,正如您所观察到的,它跳过了“ba”,因为当循环到达字符串“ab”的第二个字符时(当循环计数器
i
为1时),会进行以下递归调用:
组合(“b”,“b”,“1”)
。只能生成“bb”,不能生成“ba”。如果它是
组合(“ab”和“+”b”,1)
,则会得到预期的组合“ba”和“bb”

因此,您需要将整个字符串传递到每个递归调用中:

  combinations(s, prfx + s.charAt(i), n-1);
这项工作:

public static void combinations(String s, int n) {
    combinations(s, "", n);
}

public static void combinations(String s, String prfx, int n) {
    if (n == 0) {
        System.out.println(prfx);
    }

    else {
        for (int i = 0; i < s.length(); i++) {
            combinations(s, prfx + s.charAt(i), n - 1);
        }
    }
}
公共静态无效组合(字符串s,int n){
组合(s,“,n);
}
公共静态无效组合(字符串s、字符串prfx、整数n){
如果(n==0){
系统输出打印项次(prfx);
}
否则{
对于(int i=0;i