Java 使用递归选择团队
我正试图写一个程序,显示所有可能的组合的团队与字符a,B,C。。。等等 输入:(5,3) 5是团队规模,3是团队规模。 从{A,B,C,D,E}中选择3个 预期产出:ABC、ABD、ABE、ACD、ACE、ADE、BCD、BCE、BDE、CDE 下面是到目前为止我编写的代码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
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++ ++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--;
}
}