2014-05-15 52 views
0

好了,這一定是一些真正愚蠢的....我的語句返回2:遞歸 - 遞增數和返回

  • 當我打印出來的價值觀,他們是正確的
  • return語句錯不知何故

代碼:

public static void main (String [] args) 
{ 
    System.out.println(countToTen(1)); 
} 

public static int countToTen(int last_answer){ 
    last_answer++; 
    if(last_answer != 10){ 
     countToTen(last_answer); 
    } 
    return last_answer; 
} 
+9

提示:當您調用時,您沒有對countToTen的返回值進行任何操作它遞歸地... –

+0

謝謝馬克,那麼爲什麼我必須這樣做呢?請發佈這個答案,所以我可以給你信用 – Petro

+0

那麼,請嘗試通過代碼調試或只是*想*關於它會返回什麼... –

回答

4

試着用替換您if聲明:

if(last_answer != 10){ 
    return countToTen(last_answer); 
} 

沒有return聲明,遞歸調用也得到執行,但永遠不會返回計算結果。

與斷碼調用的順序是這樣的:

countToTen(1) 
-> countToTen(2) 
--> countToTen(3) 
---> more calls to countToTen() 
--- ... --> countToTen(10) // do nothing, and return to the top-level method call 
-> return 2 // 2 because you incremented it using lastAnswer++ 
+0

那麼,爲什麼「返回」是必需的,您能否將它發佈到其他人的答案中!謝謝:) – Petro

+0

非常好,請爲未來的觀衆提出這個問題。我將它標記爲答案,再次感謝! – Petro

0
public static void main (String [] args) 
{ 
    System.out.println(countToTen(1));  
} 

public static int countToTen(int last_answer) 
{  
    last_answer++; 

    if(last_answer != 10) 
    { 
     return countToTen(last_answer); //Here was the error 
    } 

    return last_answer; 
} 
0

試試這個:

public static int countToTen(int last_answer){ 

    last_answer++; 

    if(last_answer != 10){ 
    return countToTen(last_answer); 
    } 
    else { 
    return last_answer; 
    } 
} 
+0

這就是現在除了現在不會編譯,因爲沒有強制性返回。 –

+0

它會編譯。所有的代碼路徑都返回一個值(沒有繞過Tyler的返回語句的代碼路徑)。有些人更喜歡'if(condition){return value;} else {return othervalue;}'if if(condition){return value;} return othervalue;',因爲它更明顯的是'return othervalue;'只發生如果'condition'是錯誤的。 – Brian

2

你的函數返回第一次調用的值。它是初始值(1)通過++語句遞增一次,所以函數返回2.

整數在Java中按值傳遞,遞增函數內傳遞的值不會改變外部值:

int x = 0; 
v(x); 
// x still 0 here. 

void v(int x) { 
    x = 100; 
} 
+0

謝謝,這是我正在尋找的解釋! – Petro

0

如果你想打印出1,2,3,4 ...... 10,你需要在每個階段打印出的答案分別

public static void main (String [] args){ 
    countToTen(1); 
} 

public static void countToTen(int last_answer){ 

    System.out.println(last_answer); 
    last_answer++; 

    if(last_answer <= 10){ 
    countToTen(last_answer); 
    } 
} 
+0

嗨莎拉,不,我只是想知道爲什麼我的結局回報是2而不是10 – Petro

+1

好吧!對不起,我錯誤地解釋了你的代碼:) –

0

我的建議

public static int countToTen(int last_answer){ 

    last_answer++; 

    if(last_answer < 10){ 
     return countToTen(last_answer); 
    } else { 
     return last_answer; 
    } 
} 

你沒有通過引用傳遞參數,它是一個副本。您在方法上下文中正在對last_answer進行修改,但此更改不會傳播到外部,因爲最後您返回last_answer ++