2013-05-12 37 views
0
public class test { 

    public static void main (String[] args) { 
     System.out.print (prod (1, 2)); 
    } 
    public static int prod (int m, int n){ 
     if (m == 0) { 
      return n+1; 
     } else if(m>0 && n == 0){ 
      return prod (m-1, 1); 
     } else if(m>0 && n >0){ 
      return prod(m-1,prod(m,n-1)); 
     } 
    } 
} 

有有一些錯誤:着某種錯誤的一個簡單的Java遞歸我不明白

public static int prod (int m, int n){ 

,但我無法弄清楚它是什麼。

+3

爲什麼你說「有什麼問題」?你認爲這是什麼標準或證據? – 2013-05-12 01:00:48

+0

有一個缺少'else {return 0; }'左右。 – 2013-05-12 01:04:27

+1

...並且仍然不會發布任何錯誤消息,並且仍然忽略對您的問題的評論和請求 - 爲什麼? – 2013-05-12 01:16:29

回答

2

該方法必須在所有情況下都返回一個值。您可以在外面if語句塊

public static int prod (int m, int n) { 
    if (m == 0) { 
    return n+1; 
    } else if(m>0 && n == 0) { 
    return prod (m-1, 1); 
    } else if(m>0 && n >0) { 
    return prod(m-1,prod(m,n-1)); 
    } 

    return n; 
} 
+0

如果處理'return',則不需要'else'關鍵字和花括號。 – Mik378 2013-05-12 01:04:21

+0

謝謝你這是一個愚蠢的錯誤! – 2013-05-12 01:05:57

+0

@ Mik378我不太明白你的意思。 – 2013-05-12 01:06:59

2

有一個在的if/else鏈的末端沒有else語句添加額外的return聲明。如果m是-1會發生什麼?你們很多人都知道不會發生,但編譯器不會。

+0

你是對的,謝謝 – 2013-05-12 01:07:32

2

您必須返回一個值,並且當您的if條件都是false時,它不會。

而且,你else語句是多餘的:如果該方法的執行終止由於if,有沒有「其他」。

更改您的代碼是這樣的:

if (m == 0) 
    return n + 1; 
if (m > 0 && n == 0) 
    return prod(m - 1, 1); 
if (m > 0 && n > 0) { 
    return prod(m - 1, prod(m, n - 1)); 
// return a default value if no conditions met 
return 0; 

我不知道什麼是「督促」的意思,或意圖是什麼,所以你必須起來找出自己認爲合適的默認值是。我選擇0作爲出發點。

0

假設自然數是有意的。

public static int prod(int m, int n){ 
    if (m <= 0) { 
     return n+1; 
    } else if (n <= 0){ 
     return prod(m-1, 1); 
    } else { 
     return prod(m-1, prod(m, n-1)); 
    } 
} 

如果帶有「怪異」,則意味着遞歸終止:我沒有看到。

0

只是爲了縮短@ Reimeus的解決方案:(解釋我上面的評論)

if (m == 0) 
    return n + 1; 
if (m > 0 && n == 0) 
    return prod(m - 1, 1); 
if (m > 0 && n > 0) 
    return prod(m - 1, prod(m, n - 1)); 
return n; 

,而無需花括號和多餘的無用else關鍵字在這種情況下。

+0

是的,我明白了。謝謝〜! – 2013-05-12 01:13:59

+0

@波希米亞波希米亞人的答案有類似的做法。 – Mik378 2013-05-12 01:14:44