如何使用递归计算Java中子字符串的出现次数?

如何使用递归计算Java中子字符串的出现次数?,java,recursion,Java,Recursion,我需要使用递归计算Java中较大字符串中子字符串的出现次数。我知道递归的概念,但我不确定它是如何应用于这些问题的。有人知道怎么做吗 我也有很多类似的问题。有什么关于递归解决一般问题的建议吗?我最关心的是找到基本情况 谢谢 我认为没有真正通用的方法。但对于这个问题,我会这样做: 实际上,您不会使用递归(至少在Java中)来解决这个问题。你可以这样写: int countOccurrences(String str, String search) { int count = 0; int i

我需要使用递归计算Java中较大字符串中子字符串的出现次数。我知道递归的概念,但我不确定它是如何应用于这些问题的。有人知道怎么做吗

我也有很多类似的问题。有什么关于递归解决一般问题的建议吗?我最关心的是找到基本情况


谢谢

我认为没有真正通用的方法。但对于这个问题,我会这样做:

实际上,您不会使用递归(至少在Java中)来解决这个问题。你可以这样写:

int countOccurrences(String str, String search) {
  int count = 0;
  int i = 0;
  while (true) {
    i = str.indexOf(search, i);
    if (i == -1) {
      break;
    } else {
      count += 1;
      i += search.length();
    }
  }
  return count;
}
因此,您可以将其重写为尾部递归,类似于:

int countOccurrences(String str, String search) {
  return recurse(str, search, 0, 0);
}

int recurse(String str, String search, int count, int i) {
  i = str.indexOf(search, i);
  if (i == -1) {
    // Like the while loop where i == -1, i.e. no more occurrences found.
    // Break the recursion.
    return count;
  } else {
    // Like the while loop where i != -1: an occurrence was found.
    // Increment count, and keep on searching.
    return recurse(str, search, count + 1, i + search.length());
  }
}
希望您能看到循环和递归方法之间的共性

注意,您不需要编写尾部递归:您可以通过从
recurse
方法中删除
count
参数来编写非尾部递归,并将非末端大小写为:

return 1 + recurse(str, search, i + search.length());

Java不执行尾部调用优化,但尾部递归形式在其他语言中可能更有效(可以将其转换回循环,如上所述)。

对于这个问题,您不会递归解决,而是使用循环,将其作为循环编写,然后研究如何将其转换为尾部递归。@AndyTurner我必须使用递归。和中一样,它必须有一个基本情况和一个递归步骤。是否给了您一个子字符串模式,然后要求您计算字符串中发生的次数?或者你必须找到所有的子字符串模式并计数?你甚至试着自己做作业吗?我只得到了一个特定的字符串,但你采用的方法成功了。你对我的其他问题有什么建议吗?考虑到你所说的“我也有很多类似的问题”,我会说应用一种类似的方法:首先将其作为循环编写,然后尝试将其转换为基于循环的递归。