2013-07-22 42 views
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)); 
} 
+2

欢迎来到Stackoverflow!你用你的代码遇到了什么问题?请详细解释您的具体问题。 –

+0

你应该参加[tour](http://stackoverflow.com/about)。 –

回答

2

您的代码的问题是使用counter:每个调用级别都有其自己的counter,最初设置为零。底部的++运营商不起作用。

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

+1

这是正确的解决方案。另外,如果在练习中允许的话,我会强烈建议使用Java内置的[isUpperCase()]方法来避免在边界处拍摄自己条件;但如果这是锻炼,那就这样吧。 ;) – Bucket

1

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

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

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


NB:
在你的榜样,counter被设置为0在每个方法调用的开始处,所以这就是为什么它不起作用。如果确实想要使用counter,请将其作为参数传递给该方法,并用每个方法调用更新参数。当您到达String的末尾时,只需返回参数即可。