Java 解释递归循环的输出顺序?
谁能解释一下递归循环的打印顺序吗Java 解释递归循环的输出顺序?,java,recursion,Java,Recursion,谁能解释一下递归循环的打印顺序吗 import java.util.Scanner; public class DecimalToBinary { static Scanner console = new Scanner(System.in); public static void main(String[] args) { int decimalNum; int base; base = 2; System.o
import java.util.Scanner;
public class DecimalToBinary {
static Scanner console = new Scanner(System.in);
public static void main(String[] args) {
int decimalNum;
int base;
base = 2;
System.out.println("Enter a nonnegative integer in decimal: ");
decimalNum = console.nextInt();
System.out.println();
System.out.println("Decimal " + decimalNum + " = ");
decToBin(decimalNum, base);
System.out.println(" binary");
}
public static void decToBin(int num, int base) {
if (num == 0) {
System.out.print(0);
} else if (num > 0) {
decToBin(num / base, base);
System.out.print(num % base);
}
}
}
Num%base
必须按如下相反顺序打印:为什么调用顺序如图所示?(请帮我修改我的问题,英语是我的外语)您的打印发生在递归之后。以(25,2)为例,打印时的通话顺序如下
decToBin(25, 2):
decToBin(12,2):
decToBin(6,2):
decToBin(3,2):
decToBin(1,2):
decToBin(0,2):
print(0)
print(1%2)
print(3%2)
print(6%2)
print(12%2)
print(25%2)
删除递归调用并只保留print语句将显示您得到的顺序:
decToBin(25, 2):
print(0)
print(1%2)
print(3%2)
print(6%2)
print(12%2)
print(25%2)
如果希望以相反的顺序打印,请在递归调用之前移动print语句:
public static void decToBin(int num, int base) {
if (num == 0) {
System.out.print(0);
} else if (num > 0) {
System.out.print(num % base);
decToBin(num / base, base);
}
}
带打印的新递归:
decToBin(25, 2):
print(25%2)
decToBin(12,2):
print(12%2)
decToBin(6,2):
print(6%2)
decToBin(3,2):
print(3%2)
decToBin(1,2):
print(1%2)
decToBin(0,2):
print(0)
新产出:
decToBin(25, 2):
print(25%2)
print(12%2)
print(6%2)
print(3%2)
print(1%2)
print(0)
您的打印发生在递归之后。以(25,2)为例,打印时的通话顺序如下
decToBin(25, 2):
decToBin(12,2):
decToBin(6,2):
decToBin(3,2):
decToBin(1,2):
decToBin(0,2):
print(0)
print(1%2)
print(3%2)
print(6%2)
print(12%2)
print(25%2)
删除递归调用并只保留print语句将显示您得到的顺序:
decToBin(25, 2):
print(0)
print(1%2)
print(3%2)
print(6%2)
print(12%2)
print(25%2)
如果希望以相反的顺序打印,请在递归调用之前移动print语句:
public static void decToBin(int num, int base) {
if (num == 0) {
System.out.print(0);
} else if (num > 0) {
System.out.print(num % base);
decToBin(num / base, base);
}
}
带打印的新递归:
decToBin(25, 2):
print(25%2)
decToBin(12,2):
print(12%2)
decToBin(6,2):
print(6%2)
decToBin(3,2):
print(3%2)
decToBin(1,2):
print(1%2)
decToBin(0,2):
print(0)
新产出:
decToBin(25, 2):
print(25%2)
print(12%2)
print(6%2)
print(3%2)
print(1%2)
print(0)
输出的顺序是相反的 因为一旦调用dectobin函数
decToBin(int num, int base) {
if (num == 0) {
System.out.print(0);
} else if (num > 0) {
它到达了终点线
decToBin(num / base, base);
在获得输出任何内容的机会之前(在下面的代码中),它延迟执行并使用减少的数字参数调用dectobin函数的“另一个实例”
然后,dectobin的后续调用在同一行停止,另一个“实例”以更小的num.开始,依此类推。到目前为止,没有一个“实例”有机会打印任何内容
在某个点上,最后启动的函数的“实例”会识别其
num参数在值1以下减少;由于num是整数类型,一旦它是正的但小于1,它就被“四舍五入”为0。因此,以下条件为真:
if (num == 0) {
System.out.print(0);
然后,最后一个实例的行为与所有前一个实例不同。它没有推迟执行并创建一个新的“实例”,而是在上面的行中打印“0”,并将执行点返回给调用它的一个“实例”,然后该“实例”继续从被推迟的行运行。
然后这个“实例”输出它的编号
system.out.print(num % base);
结束时,将执行返回到启动它的执行。等等
底线是:最后启动的函数“instance”有第一个输出。首先启动的函数有最后一个输出。输出的顺序相反 因为一旦调用dectobin函数
decToBin(int num, int base) {
if (num == 0) {
System.out.print(0);
} else if (num > 0) {
它到达了终点线
decToBin(num / base, base);
在获得输出任何内容的机会之前(在下面的代码中),它延迟执行并使用减少的数字参数调用dectobin函数的“另一个实例”
然后,dectobin的后续调用在同一行停止,另一个“实例”以更小的num.开始,依此类推。到目前为止,没有一个“实例”有机会打印任何内容
在某个点上,最后启动的函数的“实例”会识别其
num参数在值1以下减少;由于num是整数类型,一旦它是正的但小于1,它就被“四舍五入”为0。因此,以下条件为真:
if (num == 0) {
System.out.print(0);
然后,最后一个实例的行为与所有前一个实例不同。它没有推迟执行并创建一个新的“实例”,而是在上面的行中打印“0”,并将执行点返回给调用它的一个“实例”,然后该“实例”继续从被推迟的行运行。
然后这个“实例”输出它的编号
system.out.print(num % base);
结束时,将执行返回到启动它的执行。等等
底线是:最后启动的函数“instance”有第一个输出