1

I'm trying to create a recursive method to find the number of occurrences of an UpperCase letter in a String. My code below:

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

}
}

I get the error:

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)
Ari K
  • 434
  • 2
  • 18

2 Answers2

3

As your String is never changing, its length will never change, so

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

will never be true unless you originally pass in a one char String

Change the value of the String s by using String.substring

Although personally I would just use a for loop and not a recursive method.

Scary Wombat
  • 44,617
  • 6
  • 35
  • 64
  • Yeah. For linear problems always use for loops. Recursiveness is a lot slower and mostly harder to understand than loops. – JayC667 Apr 26 '16 at 01:13
0

You don't need a recursive method at all, nor a for loop.

Just do:

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

But if you insist on using a recursive method, you only need a single uppercase check and a single recursive call:

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);
}
herman
  • 11,740
  • 5
  • 47
  • 58