2012-04-18 188 views
0
public class EulerProblem14 { 

int chainLength=1; 
public int findChainLength(int number){ 
    System.out.println("number "+number); 
    System.out.println("Chainlength "+chainLength); 

    if(number==1){ 
     System.out.println("the number is finally 1 return chain length"); 
     return chainLength; 
    } 
    if(number%2==0){ 
     chainLength++; 
    return findChainLength(number/2); 
    } 
    else { 
     chainLength++; 
     findChainLength(number*3+1); 
    } 
    System.out.println("THIS SHOULD NOT BE EXECUTED"); 
    return -1; 
} 
public static void main(String args[]){ 

    System.out.println(new EulerProblem14().findChainLength(13)); 

} 

在解決項目歐拉Problem 14時,我遇到了一個奇怪的問題,在我以前從未面對過的java方法返回。在上面的方法中,當數字最終爲1時,它應該返回一個鏈的數量。但這是輸入13的輸出。Java:方法返回

數13鏈長1

號40鏈長2

數20鏈長3

數10鏈長4

數5鏈長5

數16鏈長6

數8鏈長7

數4鏈長8

數2鏈長9

數1鏈長10

數爲最後1返回鏈長度

這不應該被EXECUTED

這不應該執行

-1

的問題是在最後部分時的數目變爲1,而不是返回鏈長= 10它以某種方式跳過它,並執行其中不應該被執行的代碼並返回-1。對於1,2,4,8等所有2的權力都可以正常運行,但對於其他人則不合格。

這可能是我的一個愚蠢的錯誤。儘管如此,這對我來說是一個問題。

+0

我想你只是缺少findChainLength的第二次調用返回(在else塊中) – daveb 2012-04-18 12:40:33

+0

使用遞歸的第一條規則是不使用遞歸。使用遞歸的第二條規則是不使用遞歸。 – Neil 2012-04-18 12:43:15

回答

9

我還沒有看詳細,但我懷疑這一點:

else { 
    chainLength++; 
    findChainLength(number*3+1); 
} 

實際上應該是:

else { 
    chainLength++; 
    return findChainLength(number*3+1); 
} 

然後,您應該能夠完全去除方法的最後兩行,因爲它們無法到達。

+0

你明白了!其實就是這樣。 – DonCallisto 2012-04-18 12:41:19