递归方法输出

时间:2015-09-09 17:41:25

标签: java recursion

有人可以告诉我这段代码的输出吗?我的理解是,一旦堆栈完成执行,display()方法将开始显示1,2,3,4,5,但它显示0,1,2,3,4可以解释一下这是怎么回事?

package com.test.examples.datastructures.examples.recursive;

public class Recursive {

    public static void main(String args[]) {
        int var = 5;
        recursive(var);
    }

    public static void recursive(int i) {
        System.out.println("i " +i);
        if (i<1) {
            return;
        }
        recursive(i=i-1);
        display(i);
    }

    public static void display(int i) {
        System.out.println(" " +i);
    }
}

1 个答案:

答案 0 :(得分:0)

方法display永远不会被值5调用,因为前一行从i中的值中减去一个:

    recursive(i=i-1);
    display(i);

传递给下一次递归调用的值是在之后i 的值减1。首先计算表达式i-1,然后发生对i的赋值,然后通过赋值存储在i中的值被传递给递归调用。如果将其更改为

    recursive(i-1);
    display(i);

然后显示方法调用将打印出1到5.尝试避免在递归函数中改变变量,它通常是不需要的并且只会引起混淆(并且许多人认为改变参数值是不好的样式)。您可以在递归方法的方法签名中将final放在参数i上,它将阻止更改i中的值:

public class Recursive {

    public static void main(String args[]) {
        int var = 5;
        recursive(var);
    }

    public static void recursive(final int i) {
        System.out.println("i " +i);
        if (i<1) {
            return;
        }
        recursive(i-1);
        display(i);
    }

    public static void display(int i) {
        System.out.println(" " +i);
    }
}

还有一个仅依靠输出副作用的递归方法很奇怪,你可以这样做:

import java.util.*;

public class R {

    public static void main(String[] args) {
        System.out.println(r(5));
    }

    public static List r(final int i) {
        if (i < 1) return new ArrayList();
        List list = r(i - 1);
        list.add(i);
        return list;
    }
}