查找字符串中大写字母出现次数的递归方法 - 使用辅助方法

Recursive Method to find number of occurrences of UpperCase letters in string- Using helper method

我正在尝试创建一个递归方法来查找字符串中大写字母的出现次数。我的代码如下:

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.WhosebugError
   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)

由于您的字符串永远不会改变,它的长度也永远不会改变,所以

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

除非您最初传入一个字符字符串,否则永远不会为真

使用 String.substring

更改字符串 s 的值

虽然我个人只会使用 for 循环而不是递归方法。

您根本不需要递归方法,也不需要 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);
}