Java 数量';x';字符串递归中的字符

Java 数量';x';字符串递归中的字符,java,recursion,Java,Recursion,我正在用Java练习相当基本的递归问题 给定一个字符串,递归(无循环)计算该字符串中的小写“x”字符数 - 这个很好用。但是,我想知道是否有更好的写作方法。我发现这个代码对于一个简单的问题来说很复杂。对于长度为1的字符串的特殊处理是多余的-它已经包含在else子句中: public int countX(String str) { if (str == null || str.length() == 0) return 0; } return (str.c

我正在用Java练习相当基本的递归问题

给定一个字符串,递归(无循环)计算该字符串中的小写“x”字符数

-


这个很好用。但是,我想知道是否有更好的写作方法。我发现这个代码对于一个简单的问题来说很复杂。

对于长度为1的字符串的特殊处理是多余的-它已经包含在
else
子句中:

public int countX(String str) {
    if (str == null || str.length() == 0)
        return 0;
    }
    return (str.charAt(str.length()-1) == 'x' ? 1 : 0 ) + 
           countX(str.substring(0,str.length()-1));
}

这看起来更清楚

public static int countX(String str) {
        if (str.length() == 0) {
            return 0;
        }
        int count = 0;
        if (str.charAt(0) == 'x') {
            count++;
        }
        return count + countX(str.substring(1));
    }

你认为这很麻烦的主要原因是它很麻烦。递归解决方案通常不适合计算字符串或数组中的内容。除了代码看起来很奇怪之外,至少在我看来,实际上您正在为每个字符创建一个新的堆栈帧和字符串的新版本。这是低效的(尽管我想知道
String.substring
是否经过优化以指向原始缓冲区,而不是生成完整副本,因为字符串是不可变的)

但是,考虑到问题的局限性,您可能可以去掉代码中的一些冗余检查:

public int countX(String str) {
    if(str == null || str.isEmpty())
        return 0;
    return (str.charAt(0) == 'x' ? 1 : 0) + countX(str.substring(1));
由于您已经测试了
null
和空字符串,因此长度为1的字符串不再是特例

通过在每次迭代中删除第一个字符而不是最后一个字符,可以使索引和对子字符串的调用更加清晰。这还删除了对
str.length()
的两个显式调用,如果(str.length()==1)不是必需的,因为此条件已由
返回(str.charAt(…

我不认为它可以改进得更多。事实上,我认为问题太简单了,无法使用递归(使用循环会非常简单,但您无法使用它…),而且代码将比需要的更复杂。

尝试以下方法:

public int countX(String str) {
  if (str == null)
    return 0;
  else {
        int occurrence = str.lastIndexOf("x");
        int count = occurrence > -1 ? 1 + countX(str.substring(0, occurrence)) : 0;

        return count;
  }
}

只是出于好奇,你为什么选择了
count++
而不是
count=1
?@madpysicast只是风格问题。没有区别:)
public int countX(String str) {
    if(str == null || str.isEmpty())
        return 0;
    return (str.charAt(0) == 'x' ? 1 : 0) + countX(str.substring(1));
public int countX(String str) {
  if (str == null)
    return 0;
  else {
        int occurrence = str.lastIndexOf("x");
        int count = occurrence > -1 ? 1 + countX(str.substring(0, occurrence)) : 0;

        return count;
  }
}