【问题标题】:Recursive Method to find number of occurrences of UpperCase letters in string- Using helper method递归方法查找字符串中大写字母的出现次数-使用辅助方法
【发布时间】:2016-04-26 00:04:44
【问题描述】:

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

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)

【问题讨论】:

    标签: java recursion counter uppercase helpermethods


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的。对于线性问题,请始终使用 for 循环。与循环相比,递归要慢得多,而且更难理解。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 2014-03-30
      • 2014-02-15
      • 1970-01-01
      • 2014-05-03
      • 2021-12-10
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多