2016-04-26 2 views
1

Я пытаюсь создать рекурсивный метод, чтобы найти число вхождений заглавной буквы в строке. Мой код ниже:Рекурсивного метод, чтобы найти число вхождений заглавных букв в string- Используя вспомогательный метод

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 с помощью String.substring

Хотя лично я бы просто использовал цикл for, а не рекурсивный метод.

+0

Да. Для линейных задач всегда используются для циклов. Рекурсивность намного медленнее и в основном сложнее понять, чем циклы. – 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); 
} 
Смежные вопросы