2012-10-19 124 views
4

我有以下递归函数原型:通过引用传递和递归

public void calcSim(Type<String> fort, Integer metric) 
    Integer metric = 0; 
    calcSim(fort, metric); 
    System.out.println("metric: " + metric); 
} 

我想打印的指标的值,如上所示。但它总是零。现在,当我在函数结束时打印时,我确实得到了一个有效的数字。

  1. 我如何通过引用传递或C++
  2. 什么都可以跟我关于我的参数传递做得到等同的功能怎么样? (按值,按参考等)
+0

设置[通过对象调用(共享)](http://effbot.org/zone/call-by-object.htm),请。 – 2012-10-19 20:24:45

+2

你永远不会改变'metric'的值,所以它总是打印'0'。 –

+0

@pst:感谢您的纠正。评论已删除。 –

回答

5

有没有这样的事情在Java引用通,对不起:(

你的选择是要么给方法的返回值,或使用可变的包装和你去设置的值。使用AtmoicInteger导致它在JDK中,使您自己不担心线程安全性当然会稍微快一点。

AtomicInteger metric = new AtomicInteger(0); 
calcSim(fort, metric); 
System.out.println("metric: " + metric.get()); 

然后里面的calcSim与metric.set(int i);

1

Integer是包装类。包装类是不可变的。所以,你所期待的是Integer类型无法实现的。

您可以在原语周围创建可变包装类并更新对象以实现您想要的效果。

1

两大问题:

  1. 你在你的方法重新定义metric具有相同的名称为好。程序如何打印任何东西。它应该在编译时抱怨。

  2. 没有定义退出标准。你编程(方法)停止吗?

我想你想要的东西的(因为我不知道你在做什么伪代码):

public void calcSim(Type<String> fort, Integer metric) 
    if(condtion){ 
    //print or return 
    }else{ 
     //modify fort or metric so that it exits 
     calcSim(fort, metric); //call this with modified value 
     System.out.println("metric: " + metric.value); 
    } 
} 
3

要获得通过引用传递的行为,你可以创建一个包装类,并设置在类中的值,例如:

class MyWrapper { 
    int value; 
} 

那么你可以传递一个MyWrapper你的方法并更改值,例如像这样:

public void calcSim(Type<String> fort, MyWrapper metric) 
    metric.value++; 
    System.out.println("metric: " + metric.value); 
    calcSim(fort, metric); 
}