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



在递归函数的情况下,全局变量如何工作?我下面有一个代码。为什么要打印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);
}

我想知道全局变量值保存在哪里,以及值是如何变化的?感谢

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

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

该方法有7个调用——初始调用和6个额外的递归调用。前6个调用减量giValue,因此在第7个调用中,其值为0,递归结束。

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

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

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

注意:

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

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

givalue=6;(givalue--)=>5;调用fnReverse()//打印报表尚未到达

givalue=5;(givalue--)=>4;调用fnReverse()//打印报表尚未到达

givalue=1;(givalue--)=>0;调用fnReverse()//打印报表尚未到达

现在,

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。请参阅此处。

相关内容

  • 没有找到相关文章

最新更新