Java 数量';x';字符串递归中的字符
我正在用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
这个很好用。但是,我想知道是否有更好的写作方法。我发现这个代码对于一个简单的问题来说很复杂。对于长度为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;
}
}