Java 递归计算字符串中的大写字符数

Java 递归计算字符串中的大写字符数,java,string,count,char,uppercase,Java,String,Count,Char,Uppercase,我必须解决一个练习,递归地计算一个字符串中的所有大写字符——不管我怎么想,我可能已经找到了解决方案——但它不起作用… 也许你可以帮我?谢谢 public static int CountCapitals(String s) { int counter = 0; // if (Character.isUpperCase(s.charAt(0)))counter+=1; if (s.length() == 0) return counter; if (

我必须解决一个练习,递归地计算一个字符串中的所有大写字符——不管我怎么想,我可能已经找到了解决方案——但它不起作用… 也许你可以帮我?谢谢

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));
}
public static int CountCapitals(字符串s){
int计数器=0;
//如果(Character.isUpperCase(s.charAt(0))计数器+=1;
如果(s.length()==0)
返回计数器;
如果(s.length()==1和s.charAt(0)<65和s.charAt(0)>90)
返回0;
如果(s.charAt(0)<'A'和&s.charAt(0)>'Z'){
返回CountCapitals(s.子字符串(1));
} 

如果(S.CARAT(0)>=‘A’& & S.CARAT(0)

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


您还需要将计数器作为一个参数传入,而不是期望它“结转”到其他函数调用中。

代码的问题是使用
计数器
:每个调用级别都有自己的
计数器,最初设置为零。底部的
++
运算符无效


您需要根据上一次调用的结果计算此调用的结果。基本大小写(即
s.length()==0
)没有问题;其余代码需要更改,以便返回任何
CountCapitals(s.substring(1))
当第一个字母为非大写字母时;当第一个字母为大写字母时,函数应返回
1+CountCapitals(s.substring(1))

此递归应满足您的要求:

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;
}
public static int countCapitals(字符串s){
整数计数=0;
对于(int idx=0;idx
您实际上不需要使用
计数器
变量来跟踪大写字母的数量。相反,您可以只使用递归调用本身来跟踪总数:

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值,那么可以,但如果不是,您真的应该只使用
字符.isUpperCase(char c)
。如果您不熟悉条件运算符,它的定义如下:

if(someExpression == true)
{
  //output 1
}
else
{
  //output 0
}
简洁地表示为:

(someExpression == true) ? 1 : 0

NB:
在您的示例中,
计数器
在每个方法调用的开头都设置为0,这就是它不起作用的原因。如果确实要使用
计数器
,请将其作为参数传递给该方法,并在每次方法调用时更新参数。当到达
字符串
的末尾时,只需返回参数即可

你试试这个

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

}

欢迎使用Stackoverflow!您的代码遇到了什么问题?请更详细地解释您手头的具体问题。您应该采取。这是正确的解决方案。此外,如果在练习中允许,我强烈建议使用Java内置方法,以避免边界条件伤到您自己的脚;但如果这就是练习,那就这样吧