下面的代码用于打印1到用户输入的数字之间的数字。但是,当值num
计数到等于endNum
的地步时,while循环应该不再调用“ numberToPrint”方法。
实际上发生的是,在num
等于endNum
之后,如果“ numberToPrint”方法中的if条件变为true,并继续向return
前进,则不会停止在此处实施“ numberToPrint”方法,然后立即切换到实际递归发生的第23行。
出什么问题了?为什么它不会在满足条件的return
处停止?
//recursive printing of numbers from 1 to a user's number
import java.util.Scanner;
public class recursion {
public static void main(String[] args) {
System.out.print("Type a number from 1 to 20: ");
Scanner input = new Scanner(System.in);
Integer endNum = input.nextInt();
System.out.println();
Integer num = 1;
while (num!=endNum){
numberToPrint(endNum, num);
}
}
public static int numberToPrint(int endNum, int num) {
if (num == endNum) {
System.out.print(num + ", ");
return num;
} else {
System.out.print(num + ", ");
numberToPrint(endNum, (num + 1));
return num;
}
}
}
答案 0 :(得分:0)
您的while循环不知道num值的变化,因此这里有一个infitite循环。这是由于num参数的本地作用域。当您将其传递给numberToPrint函数时,您正在使用其值的副本。而且,您永远不会用返回的值更新num。
public class recursion {
public static void main(String[] args) {
...
Integer num = 1;
while (num<= endNum){
num = numberToPrint(endNum, num); // update num value
}
}
public static int numberToPrint(int endNum, int num) {
System.out.print(num + ", ");
if (num >= endNum) {
return num;
}
return num + 1;
}
}
您在这里混合了递归和迭代。我会选择其中之一,因为在这里它们会产生大量指令。
通过递归,它看起来像这样:
Integer num = 1;
numberToPrint(endNum, num);
}
public static int numberToPrint(int endNum, int num) {
System.out.print(num + ", ");
if (num >= endNum) {
return num;
}
return numberToPrint(endNum, (num + 1));
}