Java递归 - 计算字符串中的字符

时间:2014-03-24 17:01:33

标签: java recursion

我试图找到出现次数"字符"发现于" str"使用递归。我想我有什么做的概念,但由于某种原因,当我测试它时代码不起作用...你知道为什么它错了吗?

   public static int countChar(String str, String character) {
    int number = 0;
    if(str.length()==1) {
        return number;
    }
    if (!(str.substring(0,1).equals(character))) {
        return countChar(str.substring(1), character);
    } else {
        number = number + 1;
        return countChar(str.substring(1), character);
    }
}

5 个答案:

答案 0 :(得分:4)

number是一个局部变量....

 public static int countChar(String str, String character) {
    if(str.length()==0) {
        return 0;
    }

    if ((str.substring(0,1).equals(character))) {
        return 1 + countChar(str.substring(1), character);
    }

    return countChar(str.substring(1), character);
}

终止案例是字符串长度为零时。

对于每个步骤,检查当前字符,如果匹配 - 将结果添加1作为字符串的其余部分,如果不返回字符串其余部分的匹配结果

答案 1 :(得分:2)

else情况下,number在递增后会被忽略。但无论如何都不需要它。只需在递归调用返回的内容中添加一个。

} else {
    return 1 + countChar(str.substring(1), character);
}

此外,如果字符串为空,并且length 0返回0,则您的基本情况应为。

答案 2 :(得分:2)

一些事情:

  1. 基本情况应该是str.length() == 0,而不是str.length() == 1。虽然没有正确或错误的基本情况,但这里更容易获得空字符串的正确行为。你在长度为1的字符串的基本情况下的行为实际上是错误的;如果长度1字符串确实包含字符怎么办?那你就错过了。

  2. 你的第一个if看起来不错;如果它与第一个字符不匹配,则返回应用于字符串其余部分的countChar的结果。

  3. 你的第二个if不太对劲;你想要返回1加上countChar的结果应用于字符串的其余部分。

  4. 看起来你有一个误解,就是让它变得比它需要的更难:编写代码的方式,你认为number在递归调用中保留了它的值。事实并非如此;每次进入新的递归调用时,number的值都会重置为0. number是函数的本地值,这意味着每个递归调用都会获得自己的副本。如果您希望递归调用获得类似的值,则需要将其作为参数传递,就像您使用子字符串一样。

答案 3 :(得分:1)

rgettman指定的代码:

public static int countChar(String str, String character) {

    if(str.length() == 0) {
        return 0;
    }

    if (!(str.substring(0,1).equals(character))) {
        return countChar(str.substring(1), character);
    } else {
        return 1 + countChar(str.substring(1), character);
    }
}

答案 4 :(得分:1)

首先是

int number = 0;

每次通话都会将号码初始化为0。将其设为全局或将值作为参数传递给每个调用。