首先,这不是功课。只是我练习。 我试图以递归方式确定给定字符串中出现“hi”的次数,但在每种情况下它都会跳过最后一个if if语句和字符串为空的东西。有什么想法吗?
基本上, if(字符串以“hi”开头) 将计数递增1并在第二个索引之后用字符串递归以跳过刚刚计算的“hi”
else if(字符串不以“hi”开头且字符串不为空) 在第一个索引之后用字符串递归,看它下次是否以“hi”开头。
else if(string为空) 打印(“到达文字结尾”) 返回计数;
public class Practice {
public int recur(String str, int counter){
int count=counter;
if(str.startsWith("hi")){
count++;
recur(str.substring(2),count);
}
else if((!str.isEmpty())&&(!str.startsWith("hi"))){
recur(str.substring(1),count);
}
else if(str.isEmpty()){
System.out.println("End of text reached");
return count;
}
return count;
}
public static void main(String args[]){
String str="xxhixhixx";
Practice p=new Practice();
System.out.println(p.recur(str, 0));
}
}
答案 0 :(得分:7)
这是练习调试递归函数调用的好机会 - 实际上非常困难。建议:
答案 1 :(得分:4)
正如@Steve所提到的,你必须使用recur
返回的返回值。
请参阅下面的代码修改版本,我还简化了if / else语句:
public int recur(String str, int counter) {
if (str.startsWith("hi")) {
return recur(str.substring(2), counter+1);
} else if (!str.isEmpty()) {
return recur(str.substring(1), counter);
} else {
System.out.println("End of text reached");
return counter;
}
}
public static void main(String args[]) {
String str = "xxhixhixx";
Practice p = new Practice();
System.out.println(p.recur(str, 0));
}
答案 2 :(得分:2)
您没有使用从复发返回的值。
答案 3 :(得分:2)
public int countHi(String str) {
if (str.length() <= 1) {
return 0;
}
int count = 0;
if (str.substring(0, 2).equals("hi")) {
count = 1;
}
return count + countHi(str.substring(1)); //substring off
}
所有这一切都是递归地计算字符串的数量&#34; hi&#34;在一个更大的String中。其余的实现应该是小菜一碟,快乐编码!
答案 4 :(得分:1)
您的程序打印'文本结束'最终是正确的,因为它将到达那里的逻辑,计数总是为0的原因是在每次迭代中他们改变自己的副本,最后到达终止条件时(字符串为空)结果从堆栈中弹出,因此您收到的最终结果是count为0的第一次迭代的弹出,因此您必须在每一步返回recur返回的值,而不是返回count。 / p>
答案 5 :(得分:-1)
public static int recursive(String givenStr) {
int count =0 ;
Pattern pattern = Pattern.compile("hi");
Matcher match = pattern.matcher(givenStr);
while(match.find()){
System.out.println(match);
count++;
}
return count;
}
这将返回“hi”出现在字符串
中的次数