在递归函数的情况下,全局变量如何工作? 我有一个代码如下。为什么这会输出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);
}
我想知道全局变量值的保存位置,以及值的变化情况如何? 感谢
答案 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。