【问题标题】:(Java) Trouble with creating a substring in a recursive method(Java) 在递归方法中创建子字符串时遇到问题
【发布时间】:2017-06-18 23:34:36
【问题描述】:

我正在完成第 10 版 Java 编程简介(综合版)的练习 18.10,内容如下:

编写一个递归方法,使用以下方法头来查找字符串中指定字母出现的次数:

public static int count(String str, char a)

所以这是我的方法实现:

public static int count(String str, char a)
{

    if (str.charAt(str.length() - 1) != a)
        return 0;
    else
        return 1 + count(str.substring(0, str.length()), a);
}

我的基本情况检查最后一个字符是否是指定的“重复字符”;如果不是,它会将字符在字符串中出现的次数加 1,然后递归调用 count 方法。

使用此实现运行程序会导致 StackOverflowError。我猜这可能是由于无限递归,而正是这段代码导致了问题:

str.substring(0, str.length())

问题是,我不完全确定我理解为什么。 substring(int beginIndex, int endIndex) 方法的描述为

返回一个字符串,它是该字符串的子字符串。子字符串从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。

所以按照我写的方式,它应该返回一个包含原始字符串中除最后一个字符之外的每个字符的子字符串,从而通过递归一次删除字符串的一个字符。

我可以理解为什么这可能存在问题,因为当字符串的长度为 1 或 0 时,没有什么可以告诉递归停止,但由于问题是 StackOverflowError 而不是 IndexOutOfBounds 异常,我我有点迷路了。。

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    您应该使用[string - the_last_character] 调用该方法(递归),因为最后一个字符已经被检查和计数。

    此外,你必须检查字符串是否为空才能停止递归。

    试试这个:

    public static int count(String str, char a)
    {
    
      if(str.length() == 0) // here we have to stop the recursion as the string is empty!
          return 0;
      if (str.charAt(str.length() - 1) != a)
          return count(str.substring(0, str.length() - 1), a); // here we send the string - the last character which has been already checked.
      else
          return 1 + count(str.substring(0, str.length() - 1), a);
    }
    

    【讨论】:

      【解决方案2】:

      str.length() 方法不返回字符串中最后一个字符的索引;它返回字符串的长度。考虑字符串“A”——最后一个字符的索引是 0(零),但 str.length() 返回 1。

      所以目前str.substring(0, str.length()) 返回的字符串等于整个字符串str

      相反,您想更改代码,使 substring 的第二个参数比字符串的长度少一个字符,这样结果就会比原来的短一个字符:

      return 1 + count(str.substring(0, str.length() - 1), a);
      

      【讨论】:

        【解决方案3】:
        return 1 + count(str.substring(0, str.length()), a)
        

        这就是问题所在。您正在使用整个字符串进行递归调用。所以函数不断重复,检查同一个字符。相反,返回一个子字符串:

        return 1 + count(str.substring(0, str.length() - 1), a)
        

        您还需要为 str.length() == 0 添加基本情况。

        【讨论】:

        猜你喜欢
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2011-06-05
        • 2020-06-26
        • 2019-04-03
        相关资源
        最近更新 更多