我正在练习递归问题。有些类型的问题要求你计算String
中没有循环的特定字符数。
我应该使用哪种方法?谁能向我解释一下?
这是一个问题:“给定一个字符串,递归计算(无循环)字符串中小写的'x'字符数。”
我的代码:
public int countX(String str) {
if(str.length()==0){
return 0;
}
if(str.charAt(0)=='x'){
return 1+ countX(str.substring(1));
}
return countX(str);
}
答案 0 :(得分:3)
你几乎就在那里,但你需要修改str
中第一个字母不是'x'
的情况。您当前正在做的事情将导致无限递归,因为在str.charAt(0) != 'x'
的情况下,您在countX
上递归调用str
。但是,str
仍然是第一个字母没有'x'
的字符串,因此它会一次又一次地在countX
上调用str
等等..所以解决方案是只在countX
上调用str.substring(1)
,当它的第一个字母不是'x'
时,
public int countX(String str) {
if(str.length()==0){
return 0;
}
if(str.charAt(0)=='x'){
return 1 + countX(str.substring(1));
}
else{
return countX(str.substring(1));
}
}
您的方法在
之前做了什么假设我在countX
上调用了"Hello"
,这里是调用堆栈跟踪的样子,
call countX("Hello")
"Hello".length() != 0 so we move on to the next condition
"Hello".charAt(0) != 'x' so we call countX("Hello")
call countX("Hello")
"Hello".length() != 0 so we move on to the next condition
"Hello".charAt(0) != 'x' so we call countX("Hello")
call countX("Hello")
"Hello".length() != 0 so we move on to the next condition
"Hello".charAt(0) != 'x' so we call countX("Hello");
.
.
.
infinite recursion
新解决方案的作用
call countX("Hello")
"Hello".length() != 0 so we move on to the next condition
"Hello".charAt(0) != 'x' so we call countX("ello")
call countX("ello")
"ello".length() != 0 so we move on to the next condition
"ello".charAt(0) != 'x' so we call countX("llo")
call countX("llo")
"llo".length() != 0 so we move on to the next condition
"llo".charAt(0) != 'x' so we call countX("lo");
call countX("lo")
"lo".length() != 0 so we move on to the next condition
"lo".charAt(0) != 'x' so we call countX("o");
call countX("o")
"o".length() != 0 so we move on to the next condition
"o".charAt(0) != 'x' so we call countX("");
call countX("")
"".length() == 0 so return 0
return 0
return 0
return 0
return 0
return 0
请注意,在解决方案中,我们始终可以找到基本案例(str.length()==0
)。在此之前,会有一些情况(当我们遇到一封非x的字母时)会阻止该方法达到基本情况。
答案 1 :(得分:2)
我应该使用哪种方法?谁能向我解释一下?
一种解决方案是使用StringBuilder
并在每次调用方法时删除第一个字符,最终,您将获得基本情况并输出正确的结果。
public int countX(String str) {
if(str.length() == 0) return 0;
StringBuilder builder = new StringBuilder(str);
if(str.charAt(0) == 'x'){
builder.deleteCharAt(0);
return 1 + counter(builder.toString());
}
builder.deleteCharAt(0);
return counter(builder.toString());
}
但是,如果您希望继续使用当前的解决方案,则需要将其替换为:
return countX(str);
用这个:
return countX(str.substring(1));
问题在于,如果当前字符不是'x'
,您只是忽略它并且没有简化基本情况下的问题。
答案 2 :(得分:0)
我理解你的需要。在下面,您可以使用递归计算字符串中字符的方法。
static int countCharRecursively(String str, char ch){
if(str.indexOf(ch) != -1)
{
return countCharRecursively(str.substring(0, str.indexOf(ch)), ch)+
countCharRecursively(str.substring(str.indexOf(ch)+1),ch) + 1;
}
else{
return 0;
}
}
这是一个可以运行的完整程序。
public class CountCharRecursivelyInString{
public static void main(String[] args){
String str = "hello the world";
char ch = 'l';
int nbr = countCharRecursively(str, ch);
System.out.println(ch + " : " + nbr);
}
static int countCharRecursively(String str, char ch){
if(str.indexOf(ch) != -1)
{
return countCharRecursively(str.substring(0, str.indexOf(ch)), ch)+
countCharRecursively(str.substring(str.indexOf(ch)+1),ch) + 1;
}
else{
return 0;
}
}
}