再次调用时如何在递归方法中打印另一个语句

How to print another statement in a recursive method when called again

提问人:vishalpd 提问时间:4/22/2023 最后编辑:vishalpd 更新时间:4/22/2023 访问量:48

问:

该方法要求用户输入 String。如果新团队不存在,则将其添加到 arraylist 中,否则将再次运行该方法。addTeam

我想更改它,以便如果列表中已经存在团队,它将打印“团队已经存在!请输入一个新名称“,然后再次要求用户输入,而无需在方法中打印第一个 print 语句。

编辑:我无法在方法之外创建新字段。此外,它不一定必须采用递归方法。使用循环也可以使它起作用吗?

public void addTeam(){
        System.out.print("Please enter the name of the team: ");
        String teamName = In.nextLine();   //In.nextLine() prompts user for String input
        if (teamExists(teamName) == null){ //teamExists() returns the team object if found else null 
            teams.add(new Team(teamName));
            System.out.println("Team " + teamName + " added! ");
        }
        else{
            System.out.print("Team " + teamName + " already exist! ");
            addTeam();
        }
        teamsPage();
    }

示例 I/O

Please enter the name of the team: Knicks
Team Knicks already exist! Please enter a new name: Lakers
Team Lakers already exist! Please enter a new name: Bulls
Team Bulls already exist! Please enter a new name: Warriors
Team Warriors added!
Java 递归 arraylist 方法 stdout

评论

0赞 Old Dog Programmer 4/22/2023
你需要使用递归吗?您是否考虑过循环替代方案?
0赞 vishalpd 4/22/2023
你是对的,我应该使用 while 循环,它更简单易行。我应该使用什么作为 while 循环的条件?
0赞 Old Dog Programmer 4/22/2023
轮到你了。我可能会使用while ( ! teamAddedSuccess)

答:

2赞 Visrut 4/22/2023 #1

你必须根据我们的目标保持某种可以有两个价值的东西,我们可以用它来做到这一点。stateshow first print statementdon't show first print statementboolean

因此,在您的情况下,如果我们保持为 a ,我们可以开始使用 和 获得这种行为。isAlreadyExistbooleanrecursionstate management

如下所示

public boolean isAlreadyExist = false;

public void addTeam(){
if(!isAlreadyExist) {
        System.out.print("Please enter the name of the team: ");
}
        String teamName = In.nextLine();
        if (teamExists(teamName) == null){ //teamExists() returns the team object if found else null 
            teams.add(new Team(teamName));
            System.out.println("Team " + teamName + " added! ");
            this.isAlreadyExist = false;
        }
        else{
            System.out.print("Team " + teamName + " already exist! ");
            this.isAlreadyExist = true;
            addTeam();
        }
        teamsPage();
    }

您也可以在函数参数中维护此状态,在这种情况下,您必须在调用函数时传递一个新状态,这将增加每次调用的堆栈中的内存,但如果您将状态维护为类变量本身或全局在其他语言中,它可能会节省内存。

评论

0赞 vishalpd 4/22/2023
还有别的办法吗?我无法在方法外部创建新变量。
0赞 Visrut 4/22/2023
是的,你可以通过传递参数来维护,就像我说的那样,或者基于你是否要打印消息,但你必须给出一个参数。stateaddTeam(true)addTeam(false)
0赞 vishalpd 4/22/2023
对不起,我忘了提,但该方法不必递归。事实证明,使用 while 循环会简单得多。第一次调用时,没有什么可以传递给该方法的,但让我尝试找到解决方法
1赞 vishalpd 4/22/2023 #2

该方法不必是递归的。我按照注释的建议使用 while 循环实现了函数。

public void addTeam (){
        System.out.print("Please enter the name of the team: ");
        String teamName = In.nextLine();
        while (teamExists(teamName) != null){
            System.out.print("Team " + teamName + " already exist! Please enter a new name: ");
            teamName = In.nextLine();
        }
        teams.add(new Team(teamName));
        System.out.println("Team " + teamName + " added!");
        teamsPage();
    }

我喜欢 while 循环。