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”有第一个输出