2012-10-19 161 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); 
}