我试图找到出现次数"字符"发现于" 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);
}
}
答案 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)
一些事情:
基本情况应该是str.length() == 0
,而不是str.length() == 1
。虽然没有正确或错误的基本情况,但这里更容易获得空字符串的正确行为。你在长度为1的字符串的基本情况下的行为实际上是错误的;如果长度1字符串确实包含字符怎么办?那你就错过了。
你的第一个if
看起来不错;如果它与第一个字符不匹配,则返回应用于字符串其余部分的countChar
的结果。
你的第二个if
不太对劲;你想要返回1加上countChar
的结果应用于字符串的其余部分。
看起来你有一个误解,就是让它变得比它需要的更难:编写代码的方式,你认为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。将其设为全局或将值作为参数传递给每个调用。