2

我必须解决一个练习,计算一个字符串中的所有大写字符 - 递归 - 无论如何我认为我可能已经找到了一个解决方案 - 但它不会工作......也许你可以帮助我?谢谢!

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

5 回答 5

2

您的代码的问题是使用counter:每个调用级别都有自己的counter,最初设置为零。++底部的运算符没有任何作用。

您需要根据上一次调用的结果计算本次调用的结果。您的基本情况(即s.length() == 0)很好;您的其余代码需要更改,以便CountCapitals(s.substring(1))在第一个字母非大写时返回任何内容;当第一个字母是大写时,你的函数应该返回1 + CountCapitals(s.substring(1)).

于 2013-07-22T17:28:56.100 回答
1

您需要考虑字符串长度为 1 且唯一字符为大写的情况(在这种情况下,您应该返回 1)。

此外,您需要将计数器作为参数传递,而不是期望它“延续”到其他函数调用中。

于 2013-07-22T17:28:46.143 回答
0

这个递归应该做你想要的:

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

如果这不是家庭作业,您可以尝试一种迭代方法,它的速度大约快 5-10 倍:

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;
}
于 2013-07-22T17:29:10.003 回答
0

您实际上并不需要使用counter变量来跟踪大写字母的数量。相反,您可以只使用递归调用本身来跟踪总数:

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

如果这是用于分配并且您必须使用 ASCII 值,那么很好,但如果不是,您真的应该只是Character.isUpperCase(char c). 如果你不熟悉条件运算符,它的定义如下:

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

简洁地表示为:

(someExpression == true) ? 1 : 0


注意:
在您的示例中,counter在每个方法调用开始时设置为 0,这就是它不起作用的原因。如果您真的想使用 a counter,请将其作为参数传递给方法,并在每次方法调用时更新参数。当您到达末尾时String,只需返回参数即可。

于 2013-07-22T17:39:02.070 回答
-1

你试试这个

公共类 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"));
  
 }

}
于 2020-07-24T11:02:11.323 回答