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