Java递归计数

时间:2011-11-14 15:40:30

标签: java recursion

首先,这不是功课。只是我练习。 我试图以递归方式确定给定字符串中出现“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));
  }
}

6 个答案:

答案 0 :(得分:7)

这是练习调试递归函数调用的好机会 - 实际上非常困难。建议:

  • 使用策略性放置的print-statements来确保从一个递归调用到下一个
  • 正确地更改参数
  • 重构if语句中的case-analysis顺序,使其更清晰。例如,1)检查字符串是否为空(基本情况),2)检查字符串是否以“hi”开头,3)catch-all - 不为空且不以“hi”开头

答案 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”出现在字符串

中的次数