2013-07-22 45 views
2

我必須解決一個練習,遞歸地計算字符串中的所有大寫字符 - 無論如何,我想我可能找到了解決方案 - 但它不會工作... 也許你可能會幫助我?謝謝!遞歸計算字符串中的大寫字母

public static int CountCapitals(String s) { 
    int counter = 0; 
    // if (Character.isUpperCase(s.charAt(0)))counter+=1; 
    if (s.length() == 0) 
     return counter; 
    if (s.length() == 1 && s.charAt(0) < 65 && s.charAt(0) > 90) 
     return 0; 
    if (s.charAt(0) < 'A' && s.charAt(0) > 'Z') { 
     return CountCapitals(s.substring(1)); 
    } 
    if (s.charAt(0) >= 'A' && s.charAt(0) <= 'Z') 
     counter++; 
     return CountCapitals(s.substring(1)); 
} 
+2

歡迎來到Stackoverflow!你用你的代碼遇到了什麼問題?請詳細解釋您的具體問題。 –

+0

你應該參加[tour](http://stackoverflow.com/about)。 –

回答

2

您的代碼的問題是使用counter:每個調用級別都有其自己的counter,最初設置爲零。底部的++運營商不起作用。

您需要基於前一次調用的結果計算此調用的結果。您的基本情況(即s.length() == 0)沒有問題;其餘的代碼需要改變,以便在第一個字母爲非大寫字母時返回任何CountCapitals(s.substring(1));當第一個字母是大寫時,你的函數應該返回1 + CountCapitals(s.substring(1))

+1

這是正確的解決方案。另外,如果在練習中允許的話,我會強烈建議使用Java內置的[isUpperCase()]方法來避免在邊界處拍攝自己條件;但如果這是鍛鍊,那就這樣吧。 ;) – Bucket

1

你需要考慮的情況下,當字符串的長度爲1,唯一的字符是大寫字母(在這種情況下,你應該返回1)。

此外,你需要傳遞計數器作爲參數,而不是期待它「繼續」到其他函數調用中。

0

這個遞歸應該只是你想要什麼:

public static int countCapitals(String s) { 
    if (s.length() == 0) return 0; 
    int cap = Character.isUpperCase(s.charAt(0)) ? 1 : 0; 
    return countCapitals(s.substring(1)) + cap; 
} 

如果這不是一個家庭作業,你可以嘗試一種迭代的方法是快5-10倍:

public static int countCapitals(String s) { 
    int count = 0; 
    for (int idx = 0; idx < s.length(); idx++) { 
     if (Character.isUpperCase(s.charAt(idx))) { 
      count++; 
     } 
    } 
    return count; 
} 
0

您並不需要使用counter變量來跟蹤大寫字母的數量。相反,你可以遞歸調用本身,跟蹤總數的:

public static int CountCapitals(String s) 
{ 
    if (s.length() == 1) 
     return (Character.isUpperCase(s.charAt(0)) ? 1 : 0); 
    else 
     return CountCapitals(s.substring(1)) + 
       (Character.isUpperCase(s.charAt(0)) ? 1 : 0);  
} 

如果這是一個任務,你必須使用ASCII值,再細,但如果沒有,你真的應該只Character.isUpperCase(char c)。如果你不熟悉的條件運算符,它的定義如下:

if(someExpression == true) 
{ 
    //output 1 
} 
else 
{ 
    //output 0 
} 

簡潔地表示爲:

(someExpression == true) ? 1 : 0 


NB:
在你的榜樣,counter被設置爲0在每個方法調用的開始處,所以這就是爲什麼它不起作用。如果確實想要使用counter,請將其作爲參數傳遞給該方法,並用每個方法調用更新參數。當您到達String的末尾時,只需返回參數即可。