在java中使用全局变量的递归

时间:2015-06-23 10:53:24

标签: java recursion global-variables

在递归函数的情况下,全局变量如何工作? 我有一个代码如下。为什么这会输出7 0作为输出?

int giValue=6;
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Demo obj1=new Demo();
    obj1.fnReverse();
}

public void fnReverse(){
    if(giValue>0){
        giValue--;
        fnReverse();
    }
    System.out.println(" "+giValue);
}

我想知道全局变量值的保存位置,以及值的变化情况如何? 感谢

3 个答案:

答案 0 :(得分:4)

它打印7个零,因为在每次递归调用结束时,您打印的值为giValue。由于该方法在giValue达到0之前永远不会到达print语句,因此在递归展开时它只打印0。

由于giValue--;行,该值正在发生变化。 giValue不是全局变量。它是Demo类的实例变量,当您创建Demo实例时,其值初始化为6。

该方法有7次调用 - 初始调用和6次额外的递归调用。前6个调用递减giValue,因此在第7次调用期间,其值为0并且递归结束。

答案 1 :(得分:0)

@Eran描述了你获得7 0s的原因。

在递归方法中使用全局变量通常是错误的。但如果你真的坚持这样做,那么打印0 1 ... 6的方式就是

public void fnReverse(){
    int printMeInstead=giValue;
    if(giValue>0){
        giValue--;
        fnReverse();
    }
    System.out.println(" "+printMeInstead);
}

注意:

这只会形成PRIMITIVE DATATYPE(因为实际值被复制而不是对象的引用)

答案 2 :(得分:0)

假设您确实理解了程序的逻辑流程。

givalue = 6; (givalue - )=→5;调用fnReverse(); //尚未到达的print语句

givalue = 5; (givalue - )=→4;调用fnReverse(); //尚未到达的print语句

givalue = 1; (givalue - )=大于0;调用fnReverse(); //尚未到达的print语句

立即,

givalue = 0 ; // givalue> 0 评估为false; 第一次打印声明 将givalue打印为0

同样,对于所有前6次调用,print语句正确打印当前的givalue值,由于它是一个全局变量,现在显然是 0。 因此,输出 7个零

class Demo{
int giValue=6;
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Demo obj1=new Demo();
    obj1.fnReverse();
}

public void fnReverse(){
    System.out.println(" "+giValue);
    if(giValue>0){
        giValue--;
        fnReverse();
    }
    //System.out.println(" "+giValue);
}
}

此代码将按降序从6打印到0 。请参阅here