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

使用递归挑选团队

江仲渊
2023-03-14

我正在尝试编写一个程序,显示具有字符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

我做错了什么?

共有3个答案

宋岳
2023-03-14

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

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--;
    }
}
罗睿识
2023-03-14

代替

start++

使用

start + 1

如果您使用startstart变量将仅在递归之后增加,而不是在调用递归之前增加。

使用起始 1 将新值作为参数传递。

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

    < li >开始1 < li >开始 < li >开始

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传递给递归。

祁彬
2023-03-14

首先,你应该改变

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类: 以下一行: 产生以下输出: 到目前为止还不错。结果是绝对正确的。 但是,在阅读了这个问题之后,我对在递归方法中的用法有些担心。特别是,我想知道流是如何被扩展的(如果这是术语的话)。因