初学者编程练习(Java):递归计算字符串中子字符串的实例(.equals()?)

时间:2014-03-04 22:06:15

标签: java string recursion

我正在Codingbat.com上进行一系列在线练习,以获得自己的乐趣。一组练习侧重于递归编程。在其中一个练习中,我编写了以下函数来返回传递字符串中char'x'的频率:

       public int countX(String str) {
/*Given a string, compute recursively (no loops) the number of lowercase 'x' 
chars in the string.*/
            if (str.length()< 1){
                return 0;
            }else if (str.charAt(0) == 'x'){
                return countX(str.substring(1)) + 1;
            }else{
                return countX(str.substring(1));
            }
}

根据Codingbat网站的说法,这很好。

下一个练习是计算字符串中子串“hi”的频率。我尝试使用substring()代替charAt()来修改我之前的方法:

       public int countHi(String str) {
/*Given a string, compute recursively (no loops) the number of times lowercase 
"hi" appears in the string.*/
              if (str.length()< 2){
                return 0;
            }else if (str.substring(0, 1).equals("hi")){
                return countHi(str.substring(1)) + 1;
            }else{
                return countHi(str.substring(1));
            }
}

然而,这总是返回0.它看起来像测试条件

 }else if (str.substring(0, 1).equals("hi")){

永远不会满足,但我无法理解为什么。希望有人可以帮忙!

编辑:

Steve和JustinKSU指出,我正在返回一个单字符子串。我认为substring()方法中的索引号引用了字符索引,好像它们存储在一个数组中(其中0表示第一个字符,1秒等)。它看起来像是一个更好的思考方式它是substring()索引表示字符串中字符分隔符的计数,从第一个字符前面的分隔符开始(这样substring(0, 1) 封装第一个字符)。

3 个答案:

答案 0 :(得分:3)

str.substring(0, 1)
只返回一个字符,因此它永远不会匹配“hi”,它有2个字符。你应该试试

str.substring(0, 2)而不是

答案 1 :(得分:1)

您正在寻找

str.substring(0, 2)

答案 2 :(得分:0)

您可以避免使用subString()并消除复杂性。

for