我正在尝试编写一个程序,显示具有字符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);
}
}
}
我尝试使用< code>(n,k) = (n-1,k-1) (n-1,k)定理。(其中n =组大小k =团队大小)。我当前的输出是
AAA
AAB
AAC
AA
ABB
ABC
AB
ACC
AC
A
BBB
BBC
BB
BCC
BC
B
CCC
CC
C
我做错了什么?
这是我收藏的同一个程序...
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--;
}
}
代替
start++
使用
start + 1
如果您使用start
,start
变量将仅在递归之后增加,而不是在调用递归之前增加。
使用起始 1
将新值作为参数传递。
在 java 中,有 3 个不同的运算符可用于递增一个变量:
start 1是一个值为start 1的表达式,它不递增start。
开始是一个表达式,其值是开始(不是开始1),它将开始增加1
开始是一个表达式,其值为开始1,并将开始增加1。
这里是初始值为5的示例。
start + 1 start++ ++start
--------- ------- --------
initial start value 5 5 5
end start value 5 6 6
expression value 6 5 6
请注意,开始 1
并没有真正改变开始
。您需要像 start = start 1
这样的代码来更改它。
在代码中,您对更改当前方法中start的值不感兴趣。您只需要将start 1传递给递归。
首先,你应该改变
showTeam(sequence+start,start++,n-1,k-1);
showTeam(sequence,start++,n-1,k);
到
showTeam(sequence+start,(char)(start+1),n-1,k-1);
showTeam(sequence,(char)(start+1),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
问题内容: 我具有以下表结构: 因此,每个论坛帖子都有一个父母,也有一个父母(根帖子除外),等等。我需要的是获取一个论坛帖子所拥有的孩子总数,包括他的孩子的孩子,孙子的孩子等等。 现在,我有一个简单的选择返回直接子代: 我什至不确定这是否可以通过sql来实现,但是我是SQL的入门者,因此我认为也许有人可以提出一些想法。 任何帮助表示赞赏。谢谢。 问题答案: 这应该做到这一点: 您可以通过修改条件来
问题内容: 我看到了这个答案,我希望他是不对的,就像有人不正确地告诉主键在一个列上,而我不能在多个列上设置它一样。 这是我的桌子 我想选择用户ID 2并递归,以便获得其所有直接子对象和间接子对象(即ID 4和5)。 如何以这种方式工作?我在postgresql和sqlserver中看到了递归。 问题答案: 看起来很麻烦,但是要使用它, (或您要在层次树中查找的任何密钥ID)。 前提是从您正在使用的
VM挑选 Python解释器或Python虚拟机有很多种实现,CPython是最主流的实现。CPython同时也是别的虚拟机实现的参考解释器。 PyPy是用Python实现的Python解释器,Jython是用Java实现运行在JVM上的解释器,IronPython是用Microsoft .NET CLR实现的解释器。 除非解释器的选择非常非常重要,我们一般都用CPython。 如果上面那些关于版
问题内容: 这是情况。我有两个表: 用户(网站的注册用户), 消息(彼此之间发送的个人消息) 消息表具有以下列(仅是重要的列): ID, 发件人(发送消息的用户的ID), 发送消息的用户的接收者ID), reply_to(此消息要回复到的消息的ID,可以为NULL) 我需要做的是构造一个SELECT查询,该查询将选择2个用户之间的完整对话。即,如果用户A回复了从用户B发送的消息,而用户B回复了该消
问题内容: 有什么方法可以混合使用递归和语句吗?例如,无限数生成器(使用递归)将类似于: 我试过了: 和 但是他们都没有做我想要的事情,第一个在屈服后停止,第二个在屈服之后,然后是发电机,然后停了下来。 注意: 请知道,您可以使用while循环来做到这一点: 我只想知道这是否可以递归进行。 问题答案: 是的,您可以这样做: 但是,一旦达到最大递归深度,这将出错。 从Python 3.3开始,您将可
请考虑以下类: 注意:很重要的一点是,我不能修改这个类,因为我是从外部API中使用它的。 还要考虑以下订单层次结构: 通过递归地使用(以及一个helper类),我已经设法做到了这一点,如下所示: 这是helper类: 以下一行: 产生以下输出: 到目前为止还不错。结果是绝对正确的。 但是,在阅读了这个问题之后,我对在递归方法中的用法有些担心。特别是,我想知道流是如何被扩展的(如果这是术语的话)。因