1

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

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

2 回答 2

3

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

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

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

s使用String.substring更改字符串的值

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

于 2016-04-26T00:08:16.533 回答
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);
}
于 2016-04-26T00:36:28.233 回答