2017-10-28 74 views
2

我想學習遞歸,它的行爲真的很奇怪。我有以下簡單的方法來減少給定的值和總和偶數,直到值變爲0.然而,一旦值= 0,它開始只訪問遞歸調用(在IF-ELSE條件下)並開始增加我的價值回來,並再次添加,直到它回到初始值。我錄製了2個截屏視頻。例如,如果我在類中創建主方法並使用5執行方法,例如,我會接收輸出6,這是正確的,但是在JUnit測試中,對於相同的值,它期望,但實際值爲!我不確定我做錯了什麼。而且,一旦數值達到0,我是否返回正確的東西?我不知道如何返回和那裏,但在同一時間有總和返回方法本身的輸出..遞歸遞減值然後意外遞增

class EvenSums { 
    private static int sum = 0; 

    public static int sumEvenRec(int n) { 
    int input = n; 

    if(input <= 0) { 
     return 0; 
    } else { 
     if(input % 2 == 0) { 
      sum += input; 
     } 
     sumEvenRec(input-1); 
    } 
    return sum; 
} 

這裏的調試截屏(注意輸入的降低後升高值)並注意它是如何從迴歸和迴歸到以某種方式增加輸入值的遞歸函數。 DEBUG SCREENCAST

在測試截屏可以看到:
對於輸入2:java.lang.AssertionError: expected:<2> but was:<58>
對於輸入5:java.lang.AssertionError: expected:<6> but was:<64>
對於輸入6:java.lang.AssertionError: expected:<12> but was:<76>

Intrestingly,對於輸入:作品
TEST SCREENCAST

回答

0

你的JVM的同一運行過程中做很多測試,因此靜態字段sum保持從之前的測試(這就是爲什麼靜態變量應避免或非常小心使用的原因),它的價值。

您應該消除該字段並將該和作爲遞歸調用的返回值(您已經返回一個值,但以不同方式進行)。

+0

天哪,工作!謝謝!刪除了靜態並創建了一個對象。是!謝謝! – WannaBeForNow