Java 使用递归选择团队

Java 使用递归选择团队,java,algorithm,recursion,Java,Algorithm,Recursion,我正试图写一个程序,显示所有可能的组合的团队与字符a,B,C。。。等等 输入:(5,3) 5是团队规模,3是团队规模。 从{A,B,C,D,E}中选择3个 预期产出:ABC、ABD、ABE、ACD、ACE、ADE、BCD、BCE、BDE、CDE 下面是到目前为止我编写的代码 public class teamApp { public static void main(String[] args) { int groupSize =5; int teamS

我正试图写一个程序,显示所有可能的组合的团队与字符a,B,C。。。等等

输入:(5,3)

5是团队规模,3是团队规模。

从{A,B,C,D,E}中选择3个

预期产出:ABC、ABD、ABE、ACD、ACE、ADE、BCD、BCE、BDE、CDE

下面是到目前为止我编写的代码

public class teamApp 
{
    public static void main(String[] args) {
        int groupSize =5;
        int teamSize = 3;
        char start = 'A';
        String sequence = "";
        showTeam(sequence,start,groupSize,teamSize);
    }

    public static void showTeam(String sequence,char start, int n, int k)
    {
        if(n==0||k==0||k>n) {
            System.out.println(sequence);
            return;
        } else {
            showTeam(sequence+start,start++,n-1,k-1);       
            showTeam(sequence,start++,n-1,k);
        }
    }
}
我试图使用
(n,k)=(n-1,k-1)+(n-1,k)
定理。(其中n=groupSize k=teamSize)。我当前的输出是

AAA
AAB
AAC
AA
ABB
ABC
AB
ACC
AC
A
BBB
BBC
BB
BCC
BC
B
CCC
CC
C

我做错了什么?

首先,你应该改变

showTeam(sequence+start,start++,n-1,k-1);
showTeam(sequence,start++,n-1,k);

否则,只有第二个递归调用将获得递增的
start
(因为
start++
返回
start
的原始值)

其次,当递归展开时,也会打印部分序列。要避免这种情况,请添加以下条件:

    if (n==0||k==0||k>n) {
        if (k==0) // this condition will make sure that only complete
                  // sequences of k elements will be printed
            System.out.println(sequence);
    } else {
        showTeam(sequence+start,(char)(start+1),n-1,k-1);
        showTeam(sequence,(char)(start+1),n-1,k);
    }
输出:

ABC
ABD
ABE
ACD
ACE
ADE
BCD
BCE
BDE
CDE
而不是

start++
使用

如果使用
start++
,则
start
变量只会在递归之后增加,而不会在调用递归之前增加

使用
start+1
将新值作为参数传递


在java中,有3种不同的运算符可用于将变量递增1:

  • 开始+1
  • 开始++
  • ++开始
start+1是一个值为start+1的表达式,它不递增start

start++是一个值为start(不是start+1)的表达式,它将start递增1

++start是一个表达式,其值为start+1,并以1递增start

这里是一个初始值为5的示例

                      start + 1         start++           ++start
                      ---------         -------          --------
 initial start value      5                 5                5
 end start value          5                 6                6
 expression value         6                 5                6
请注意,
start+1
实际上并没有改变
start
。您需要像
start=start+1
这样的代码来更改它


在代码中,您对在当前方法中更改start的值不感兴趣。您只需将start+1传递给递归。

这是我的收藏中的同一个程序

public class TeamSelector {

    public static void main(String[] args) {
        String sequence = "";
        int groupSize = 5;
        int teamSize = 3;
        showTeams(groupSize, teamSize, sequence, 'A', teamSize - 1);
    }

    public static void showTeams(int groupSize, int teamSize, String sequence, 
                                                char groupMember, int validNode) {
        if (teamSize > groupSize || groupSize < 0 || teamSize < 0) return;

        sequence += Character.toString(groupMember);
        groupMember++;
        // Left call
        showTeams(groupSize - 1, teamSize - 1, sequence, groupMember, validNode);
        sequence = sequence.substring(0, sequence.length() - 1);

        if (sequence.length() == validNode) {
            System.out.println(sequence + (char) (groupMember - 1));
        }
        // Right call
        showTeams(groupSize - 1, teamSize, sequence, groupMember, validNode);
        groupMember--;
    }
}
公共类组选择器{
公共静态void main(字符串[]args){
字符串序列=”;
int-groupSize=5;
int teamSize=3;
展示团队(团队规模、团队规模、序列“A”、团队规模-1);
}
公共静态void showTeams(int-groupSize、int-teamSize、字符串序列、,
字符组成员,int validNode){
如果(teamSize>groupSize | | groupSize<0 | | teamSize<0)返回;
序列+=字符.toString(groupMember);
groupMember++;
//左转
showTeams(groupSize-1,teamSize-1,sequence,groupMember,validNode);
sequence=sequence.substring(0,sequence.length()-1);
if(sequence.length()==validNode){
System.out.println(序列+(字符)(groupMember-1));
}
//正确的选择
showTeams(groupSize-1,teamSize,sequence,groupMember,validNode);
集团成员--;
}
}

作为这方面的一个侧节点,
返回是不必要的,只是一个侧注:不要使用static main来测试代码。改为编写单元测试。使用单元测试,您可以从小示例开始;还有隐式检查。这比只在控制台上打印东西要好得多。因为当你的算法只是“稍微”不正确时,它太容易被忽略。你所说的单元测试是什么意思?这似乎几乎解决了问题。但它仍然打印出长度小于teamSize(k)的序列。我该怎么办呢?谢谢你的回复。但是我觉得start++和start+1之间的区别有点不清楚。在我的案例A到B到C到D到E中,它们不是都只是将字符激励到下一个字符吗?虽然这个答案很好地解释了
start+1
start++
++start
之间的区别,但它只解决了OP代码中的一个问题。简单地将
start++
更改为
start+1
不仅无法给出正确的输出,甚至无法通过编译。
                      start + 1         start++           ++start
                      ---------         -------          --------
 initial start value      5                 5                5
 end start value          5                 6                6
 expression value         6                 5                6
public class TeamSelector {

    public static void main(String[] args) {
        String sequence = "";
        int groupSize = 5;
        int teamSize = 3;
        showTeams(groupSize, teamSize, sequence, 'A', teamSize - 1);
    }

    public static void showTeams(int groupSize, int teamSize, String sequence, 
                                                char groupMember, int validNode) {
        if (teamSize > groupSize || groupSize < 0 || teamSize < 0) return;

        sequence += Character.toString(groupMember);
        groupMember++;
        // Left call
        showTeams(groupSize - 1, teamSize - 1, sequence, groupMember, validNode);
        sequence = sequence.substring(0, sequence.length() - 1);

        if (sequence.length() == validNode) {
            System.out.println(sequence + (char) (groupMember - 1));
        }
        // Right call
        showTeams(groupSize - 1, teamSize, sequence, groupMember, validNode);
        groupMember--;
    }
}