2016-04-26 13 views
1

Ich versuche, eine rekursive Methode zu erstellen, um die Anzahl der Vorkommen eines UpperCase Buchstaben in einem String zu finden. Mein Code unten:Rekursive Methode, um die Anzahl der Vorkommen von UpperCase Buchstaben in Zeichenfolge zu finden - Hilfsmethode verwenden

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)); 

} 
} 

ich den Fehler:

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) 

Antwort

3

Als Ihr String nie verändert sich, seine Länge wird nie ändern, so

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

nie, es sei denn Sie wahr sein ursprünglich übergeben in einem ein Zeichen String

Ändern Sie den Wert der Zeichenfolge mit String.substring

Obwohl ich persönlich würde nur eine for Schleife und nicht eine rekursive Methode verwenden.

+0

Ja. Verwenden Sie für lineare Probleme immer for-Schleifen. Die Rekursivität ist viel langsamer und meist schwerer zu verstehen als Schleifen. – JayC667

0

Sie benötigen keine rekursive Methode oder eine for Schleife.

Just do:

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

Aber wenn Sie sich mit einer rekursiven Methode bestehen, müssen Sie nur eine einzelne Großprüfung und einen einzelnen rekursive Aufruf:

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); 
}