【发布时间】: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 异常,我我有点迷路了。。
【问题讨论】: