通过引用传递和递归

时间:2012-10-19 20:23:23

标签: java methods parameters parameter-passing

我有以下递归函数原型:

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

我想打印公制的价值,如上所示。但它始终为零。现在,当我在函数末尾打印时,我得到一个有效的数字。

  1. 如何通过引用传递或获得与C ++相同的功能
  2. 关于参数传递,我该怎么办? (按价值,参考等等)

4 个答案:

答案 0 :(得分:7)

在Java中没有通过引用传递的内容,抱歉:(

您的选项要么为方法提供返回值,要么使用可变包装器并随时设置值。使用AtmoicInteger导致它在JDK中,使你自己不担心线程安全当然会稍微快一些。

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

然后在calcSim内部设置metric.set(int i);

答案 1 :(得分:4)

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

class MyWrapper {
    int value;
}

然后您可以将MyWrapper传递给您的方法并更改值,例如:

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

答案 2 :(得分:1)

Integer是包装类。包装类是不可变的。因此,使用Integer类型无法实现您的期望。

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

答案 3 :(得分:1)

两大问题:

  1. 您正在重新定义方法中同名的metric。程序如何打印。它应该在编译时抱怨。

  2. 没有明确的退出条件。您的程序(方法)是否停止?

  3. 我认为你想要一些东西(伪代码,因为我不知道你在做什么):

     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);
       }
     }
    
相关问题