2016-04-26 73 views
1

我試圖創建一個遞歸方法來查找字符串中UpperCase字母出現次數。我下面的代碼:遞歸找到字符串中UpperCase字母出現次數的方法使用幫助器方法

public class findUppercase { 
public static int searchUppercase(String s, int high) { 
    if (s.length() == 1) { 
     if (Character.isUpperCase(s.charAt(0))) 
      return 1; 
     else 
      return 0; 
    } else if (Character.isUpperCase(s.charAt(high - 1))) 
     return 1 + searchUppercase(s, s.length() - 1); 
     else 
     return searchUppercase(s, s.length() - 1); 

} 

public static int searchUppercase(String s) { 
    return searchUppercase(s, s.length()); 
} 

public static void main(String[] args) { 
    String a = "ABCmdsaA"; 
    System.out.println(searchUppercase(a)); 

} 
} 

我得到的錯誤:

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.Character.getType(Character.java:6924) 
    at java.lang.Character.isUpperCase(Character.java:5518) 
    at java.lang.Character.isUpperCase(Character.java:5488) 
    at findUppercase.searchUppercase(findUppercase.java:9) 

回答

3

當你的字符串是永遠不會改變,它的長度將不會改變,所以

if (s.length() == 1) { 

永遠不會,除非你真的最初傳入一個字符字符串

通過使用來更改字符串s的值

雖然我個人只會使用for循環,而不是遞歸方法。

+0

呀。對於線性問題,總是使用for循環。遞歸比循環慢很多,難以理解。 – JayC667

0

根本不需要遞歸方法,也不需要for循環。

只要做到:

public static long searchUppercase(String s) { 
    return s.chars() 
      .filter(i -> Character.isUpperCase(i)) 
      .count(); 
} 

但是,如果你堅持使用遞歸方法,你只需要一個大寫的檢查和一個遞歸調用:

public static long searchUppercase(String s, long count) { 
    if (s.length() == 0) { 
     return count; 
    } 

    if (Character.isUpperCase(s.charAt(0))) ++count; 

    String tail = s.substring(1); 
    return searchUppercase(tail, count); 
} 

public static long searchUppercase(String s) { 
    return searchUppercase(s, 0); 
}