解释递归循环的打印输出顺序?

时间:2014-09-22 15:30:48

标签: 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.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必须按照以下方式打印相反的顺序:

enter image description here

为什么显示的通话顺序如何? (请帮我修改我的问题,英语是我的外语)

2 个答案:

答案 0 :(得分:3)

您的打印在递归后发生。以(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)

如果您希望打印的顺序相反,请在递归调用之前移动打印语句

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)

答案 1 :(得分:1)

输出的顺序颠倒过来 因为一旦调用了dectobin函数

   decToBin(int num, int base) {
    if (num == 0) {
        System.out.print(0);
    } else if (num > 0) {

它到达

    decToBin(num / base, base);

在有机会输出任何内容之前,它会推迟执行并调用dectobin函数的“另一个实例”并减少数字参数(在下面的代码中)

        System.out.print(num % base);
    }

然后这个后续的dectobin调用在同一行停止,另一个“实例”以更小的数量启动。等等等等。到目前为止,没有一个“实例”有机会打印任何东西。

在某个时刻,最后启动的函数的“实例”识别出它 num参数在值1下减少;并且由于num是整数类型,一旦它是正数但小于1,它将“Rounded”为0.因此以下条件为真:

    if (num == 0) {
        System.out.print(0);

然后这个最后一个实例的行为与其前任实例不同。而不是推迟执行并创建一个新的“实例”,它在上面的行中打印“0”,然后结束将执行点返回到一个“实例”,该实例调用它,然后继续从它被推迟的行开始运行。 然后这个“实例”输出它的数字

     system.out.print(num % base);

并结束自己将执行返回到启动它的那个。等等。

底线是:最后开始的函数“instance”有第一个输出。首先启动的函数有最后一个