java - 在方法内部的 if 语句中使用递归时的奇怪行为。爪哇
问题描述
在通过在线课程学习 Java 的同时,我正在尝试使用教程编写的一些代码。有一种方法应该连接“课程”并最终将它们打印出来。我想使用递归而不是循环。
private String courses = "";
private int tuitionBalance = 0;
public void enroll() {
System.out.println("Enter course to enroll or \"Q\" to quit.");
Scanner in = new Scanner(System.in);
String course = in.nextLine();
if (!course.equalsIgnoreCase("q")) {
courses = courses + "\n" + course;
tuitionBalance = tuitionBalance + costOfCourse;
enroll();
}
System.out.println("Enrolled in: " + courses);
System.out.println("Tuition balance: " + tuitionBalance);
return; // even with "return", this method executes multiple times after leaving if statement.
}
当此方法运行时,它会一直提示输入,直到按下“Q”。串联工作正常。然后它留下“if 语句”并且(对我来说很奇怪)它运行最后两行 println 代码的次数与提供的输入一样多。
例如,当我输入三种“课程”然后按“Q”时,输出为:
Enter course to enroll or "Q" to quit.
History // My entry
Enter course to enroll or "Q" to quit.
Math // My entry
Enter course to enroll or "Q" to quit.
Biology // My entry
Enter course to enroll or "Q" to quit.
q // My entry
Enrolled in:
History
Math
Biology
Tuition balance: 1800
Enrolled in:
History
Math
Biology
Tuition balance: 1800
Enrolled in:
History
Math
Biology
Tuition balance: 1800
Enrolled in:
History
Math
Biology
Tuition balance: 1800
Process finished with exit code 0
你能告诉我发生了什么吗?
编辑:我已阅读理解递归 [关闭],但我没有找到任何有关递归如何影响调用堆栈的信息。关于如何使用递归有很多很好的信息,但我仍然没有在那里找到我的问题的答案。
解决方案
问题是您不希望在用户进入课程的情况下打印递归,一个简单的 else 将解决问题
private String courses = "";
private int tuitionBalance = 0;
public void enroll() {
System.out.println("Enter course to enroll or \"Q\" to quit.");
Scanner in = new Scanner(System.in);
String course = in.nextLine();
if (!course.equalsIgnoreCase("q")) {
courses = courses + "\n" + course;
tuitionBalance = tuitionBalance + costOfCourse;
enroll();
}
else{//now it would come here only once after user has entered q after which it returns
System.out.println("Enrolled in: " + courses);
System.out.println("Tuition balance: " + tuitionBalance);
}
return;
}
推荐阅读
- azure - Azure RBAC 角色和服务主体之间的关系
- python - 如何使用 anaconda 安装包 import_ipynb?
- java - 找不到媒体类型 = 文本/纯文本、类型 = 类 TestRest.Track、通用类型 = 类 TestRest.Track 的 MessageBodyWriter
- c++ - VS-2019 程序在某些服务器上的第一个浮点指令上崩溃
- mocking - Jest "jest.mock(...) 不会覆盖原始文件
- javascript - 如何修复 HTTP 请求上的 setTimeout 行为?
- python - 重新安装python后找不到Django项目的python解释器
- typescript - 执行测试时,不调用该函数
- spring-boot - 针对 ADFS 2016 的 Spring-Security 5 OAuth2 身份验证
- android - 动态创建 kotlin 变量