user2607713
user2607713

Reputation: 181

count uppercase chars in string recursively

I have to solve an exercise, counting all the uppercase chars in a String - recursively - Anyhow I thought I might have found a solution - but it won't work… Probably you might help me? Thanks!

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

Upvotes: 2

Views: 6281

Answers (5)

john ram
john ram

Reputation: 1

You try this

public class HelloWorld{

public static int isUpperCase(String str){

    if(str.length()==0) return 0;

    boolean check =Character.isUpperCase(str.charAt(0));

    if(check){

      return  isUpperCase(str.substring(1))+1;
    }

    return isUpperCase(str.substring(1));
         
 }



   public static void main(String []args){

    String n= "FSAsdsadASdcCa";
    System.out.println(isUpperCase("FSAsdsadASdcCa"));
  
 }

}

Upvotes: -1

Steve P.
Steve P.

Reputation: 14699

You don't really need to use a counter variable to keep track of the number of capitals. Instead, you can just the recursive calls, themselves, to keep track of the total:

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

If this is for an assignment and you have to use ASCII values, then fine, but if not, you really should just Character.isUpperCase(char c). In case you're not familiar with the conditional operator, it's defined as follows:

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

is represented succinctly as:

(someExpression == true) ? 1 : 0


NB:
In your example, counter is set to 0 at the beginning of each method call, so that's why it's not working. If you really want to use a counter, pass it as a parameter to the method instead, and update the parameter with each method call. When you get to the end of the String, simply return the parameter.

Upvotes: 0

Michael Lang
Michael Lang

Reputation: 3992

This recursion should do just what you want:

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

If this wasn't a home assignment, you could try an iterative approach which is about 5-10 times faster:

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

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726569

The problem with your code is the use of counter: each level of invocation has its own counter, initially set to zero. The ++ operator at the bottom has no effect.

You need to compute the result of this invocation based on the result of the previous invocation. Your base case (i.e. s.length() == 0) is fine; the rest of your code needs to change so that it returns whatever CountCapitals(s.substring(1)) when the first letter is non-capital; when the first letter is capital, your function should return 1 + CountCapitals(s.substring(1)).

Upvotes: 2

jh314
jh314

Reputation: 27792

You need to consider the case when the length of string is 1 and the only character is uppercase (in this case, you should return 1).

Also you need to pass in the counter as a parameter rather than expecting it to "carry over" into other function calls.

Upvotes: 1

Related Questions