有人可以告诉我这段代码的输出吗?我的理解是,一旦堆栈完成执行,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);
}
}
答案 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;
}
}