字符串中'x'字符的数量 - 递归

时间:2017-03-03 18:17:31

标签: java recursion

我在Java中练习非常基本的递归问题。

“给定一个字符串,递归计算(无循环)字符串”

中小写“x”字符的数量
countX("xxhixx") → 4

countX("xhixhix") → 3

countX("hi") → 0

-

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

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

5 个答案:

答案 0 :(得分:5)

你认为这很麻烦的主要原因是它是。递归解决方案通常不是计算字符串或数组中的事物的最佳选择。除了代码看起来很奇怪之外,至少在我看来,你实际上是为每个角色创建一个新的堆栈框架和一个新版本的字符串。这是低效的(虽然我想知道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的字符串不再是特殊情况。

通过删除每次迭代而不是最后一次的第一个字符,可以使索引和对substring的调用更加清晰。这也会删除对str.length()的两次显式调用。

答案 1 :(得分:1)

长度为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));
}

答案 2 :(得分: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));
    }

答案 3 :(得分: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;
  }
}

答案 4 :(得分:0)

else if (str.length() == 1)不需要return (str.charAt(...,因为http://example.com/page已经处理了这个条件

我认为不仅可以改进它。实际上,我认为使用递归这个问题太简单了(使用循环会简单得多,但是你可以使用它......)并且代码会比需要的更复杂。