2011-11-01 118 views
0

使用遞歸如何保持局部變量更新直到滿足條件。我在下面有一個實例解釋了爲什麼問題很好。計數變量是一個局部變量,方法通過計數的時間設置爲0.我不能將計數移到方法以外,它必須是局部變量而不是靜態或其他任何東西。所需的輸出應該是(3 6 )使用遞歸如何保持局部變量更新

public static int returnInt(int b) { 

     int count = 0; 

     if (b == 6) { 

      System.out.println(count + " " + b); 
     } 

     b += 2; 
     count++; 

     return returnInt(b); 

    } 
+1

爲什麼你不允許改變任何東西? – DaveJohnston

+3

不是'count'只是'int count == b/2;'?否則,你必須將'count'變量傳遞給遞歸函數。 – Andre

+5

你知道'returnInt'永遠不會返回任何東西,對吧? :-)因爲它會在堆棧溢出崩潰之前停止。 (遞歸算法**必須**有一個退出子句。) –

回答

5

count作爲附加參數的方法:

public static int returnInt(int b, int count) { 

    ... do some stuff to b, print something, check whether end-condition has been met ... 

    return returnInt(b, count + 1); 
} 

然後,調用returnInt0一個額外的參數要開始做事了。

+2

...並添加提供終止條件的邏輯。 :-) –

+0

@TJCrowder - '檢查結束條件是否得到滿足' –

+0

'@Matt:'「...並返回」:-) –

1
public static int returnInt(int b) { 
    return returnInt(b, 0); 
} 

private static int returnInt(int b, int count) {  
    if (b == 6) { 
     System.out.println(count + " " + b); 
     // My guess is you should be returning something here??? 

     // Actually, this shouldn't be your exit point from the recursion because depending on the starting value of b, since you are always adding 2, it might never equal 6, so again you would get a StackoverflowException. 
    }  
    b += 2; 
    count++; 

    return returnInt(b, count); 
} 
+0

我的回答是對發佈的代碼的反思,TJ Crowder提出了重要的一點是,這永遠不會回來。 – DaveJohnston

1

你不能。根據定義,局部變量是本地的。它只存在於該方法當前執行的範圍內。

但是你有以下解決方案。

最好的一個是把它作爲你的方法(完全是你做其他參數b

public static int returnInt(int b) { 
    return returnInt(b, 0) 
} 
private static int returnInt(int b, int count) { 
    // your code here. 
} 

如果(對於一些奇怪的原因),你不能改變方法簽名,你可以把一個參數該變量爲ThreadLocal。在這種情況下,即使多個線程同時執行的方法,你的代碼保持線程安全的。

移動這個變量一流水平的原因是最壞的解決方案不是線程安全和休息封裝。

1

這個函數會溢出你的堆棧。使用遞歸時,您必須提供出路。至於變量計數,你每次都將它重新定義爲0。它不能在遞歸函數中初始化。嘗試將它作爲參數傳遞給你的函數,併爲你的函數提供一個出路。

public static int returnInt(int b,int count) { 

    if (b == 6) { 

     System.out.println(count + " " + b); 
     return b; 
    } 
    b+=2; 
    count++; 
    return returnInt(b); 
} 

'返回b'行可能是你的出路......而你不一定必須返回b ...返回你需要的任何東西。

+0

請注意,如果最初使用b作爲奇數或已經大於6來調用此方法,那麼退出條件永遠不會被滿足,所以其他事情必須改變。 – DaveJohnston

+0

這是真的,這只是一個例子來展示如何退出遞歸方法 – PTBG

0

一般來說,創建returnIntInner(int b,盒裝數),將大部分邏輯移動到該位置,然後從「精簡」版本的returnInt中調用該邏輯。爲了框count「舊樣式」的方式是將count作爲int [1]數組傳遞,以便它可以返回 - 我沒有研究過新的Java引用parm語法。但由於您的代碼是遞歸調用,並且在遞歸調用後不需要訪問count,所以您可以簡單地將count作爲常規參數傳遞。