在JAVA中要求用户递归地输入特定范围之间的值?
我正在用Java编写一个代码,系统将要求用户输入1到10之间的整数(包括1和10),如果值超出范围,则应递归地要求用户再次输入值。最后我必须打印出在范围内的值。 下面是我的代码: `导入java.util.Scanner; 公共类输入整合器{在JAVA中要求用户递归地输入特定范围之间的值?,java,recursion,stack,java.util.scanner,activation-record,Java,Recursion,Stack,Java.util.scanner,Activation Record,我正在用Java编写一个代码,系统将要求用户输入1到10之间的整数(包括1和10),如果值超出范围,则应递归地要求用户再次输入值。最后我必须打印出在范围内的值。 下面是我的代码: `导入java.util.Scanner; 公共类输入整合器{ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Enter first Integer betw
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Enter first Integer between 1 and 10 (both inclusive):");
Scanner sc = new Scanner(System.in);
int num1 = isInRange(sc, sc.nextInt());
System.out.println("Enter Second Integer between 1 and 10 (both inclusive):");
int num2 = isInRange(sc, sc.nextInt());
System.out.println("Num 1 is "+num1+"\nNum 2 is "+num2);
sc.close();
}
public static int isInRange(Scanner scanner, int num) {
if(num<1 || num>10) {
System.out.println("WRONG INPUT. PLease enter Integer between 1 and 10 (both inclusive):");
num =scanner.nextInt();
isInRange(scanner, num);
}
return num;
}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
System.out.println(“输入1到10之间的第一个整数(包括1和10):”;
扫描仪sc=新的扫描仪(System.in);
int num1=isInRange(sc,sc.nextInt());
System.out.println(“输入介于1和10之间的第二个整数(包括1和10):”;
int num2=isInRange(sc,sc.nextInt());
System.out.println(“Num 1为“+num1+”\nNum 2为“+num2”);
sc.close();
}
公共静态int isInRange(扫描仪,int num){
if(num10){
System.out.println(“输入错误,请输入1到10之间的整数(包括1和10):”;
num=scanner.nextInt();
isInRange(扫描仪,数字);
}
返回num;
}
}`
这将是我的输出:
我面临的问题是,当我输入错误的值时,最终当我输入正确的值时,它将打印我在第二次输入的值。假设我输入了8个超出范围的值,之后我的第9个值在范围内,因此它将打印第二次输入的值。您遗漏了一点细节:
public static int isInRange(Scanner scanner, int num) {
if(num<1 || num>10) {
System.out.println("WRONG INPUT. PLease enter Integer between 1 and 10 (both inclusive):");
num = scanner.nextInt();
num = isInRange(scanner, num); // add "num = " at the beginning of the line
}
return num;
}
public static int-isInRange(扫描器扫描器,int-num){
if(num10){
System.out.println(“输入错误,请输入1到10之间的整数(包括1和10):”;
num=scanner.nextInt();
num=isInRange(scanner,num);//在行首添加“num=”
}
返回num;
}
isInRange()返回一个您忘记设置为num的整数。您是否使用调试器检查了代码?使用调试器并单步执行代码是这个问题的最佳答案。为什么这个问题被标记为
[activationrecord]
?@JonnyHenly我一直在调试这个问题,在方法中的return语句之前放置System.out.println(num)。它正在打印用户输入的所有输入,除了第一次输入。这个问题有激活记录标签,因为当你在Java中调用一个方法时,会有一个为该函数创建的激活记录,它以堆栈的形式存储在内存中。递归地这样做真的很重要吗?也许你能找到更好的方法。一个问题是,即使一个数字“超出范围”,它仍然会在isInRange()的末尾返回。@GitPhilter是的,我知道使用循环可以很容易地完成,但我只想知道如何修复这个问题以及我做错了什么?使用System.out.println(num)
将无法显示每个变量的值(以及许多其他信息)当您执行递归时。调试器将允许您设置断点、进出函数/方法、查看变量值、更改变量值等。认真研究使用调试器,从长远来看,它将为您节省大量时间。您还可以使用num=isInRange(scanner,scanner.nextInt())
而不是在递归调用之前分配num
。可以说它可读性较差,但更紧凑。@GitPhilter谢谢,它是固定的。你能给我一个简单的解释吗,它是如何固定的?这是不是超过了堆栈中的所有值?@Jonny Hely是的,这也是可能的。我的解决方案有点奇怪,因为你在两个连续的行中将一个值指定为num,这看起来很奇怪。@Parteek Singh Bedi您的函数isInRange返回正确的int,并在末尾加上“return num”,但您从未使用返回的值。