求无局部变量的indexOf递归实现(仅接收字符串与字符输入)
递归实现无局部变量的indexOf
当然可以做到!你的递归思路已经很接近正确答案了,只是不小心用到了原生的indexOf,而且没有处理递归返回-1的情况——要是直接给这个结果加1,会错误地返回0而不是-1。我们只需要调整一下判断逻辑,完全不用任何局部变量就能满足需求。
先看你原有代码的问题:
- 开头调用了
s.indexOf(c),这违反了“不能使用原生indexOf”的要求; - 当递归子串返回-1时(说明子串里找不到目标字符),你的代码会执行
1 + (-1),导致错误返回0,而不是正确的-1。
下面是修正后的完整实现,严格遵守所有要求:
public static int indexOf(String s, char c) { if (s.length() == 0) { return -1; } if (s.charAt(0) == c) { return 0; } return indexOf(s.substring(1), c) == -1 ? -1 : 1 + indexOf(s.substring(1), c); }
逻辑解释
每一步都完全依赖递归和条件判断,没有使用任何局部变量:
- Base Case 1:如果输入字符串为空,直接返回-1——空字符串不可能包含任何字符。
- Base Case 2:如果字符串的第一个字符就是目标字符,返回0——这是我们要找的第一个匹配位置。
- 递归逻辑:如果前两个条件都不满足,就递归搜索去掉第一个字符的子串。如果子串的递归结果是-1,说明整个字符串都找不到目标字符,直接返回-1;否则返回
1 + 子串递归结果——因为我们跳过了第一个字符,所以索引要加1。
测试验证
- 调用
indexOf("hello", 'l'):递归搜索"ello"返回1,最终结果为1+1=2,正确匹配第二个'l'的索引。 - 调用
indexOf("world", 'a'):所有递归分支都会返回-1,最终结果为-1,正确提示未找到。 - 调用
indexOf("", 'x'):直接触发Base Case 1,返回-1,正确处理空串。
注:这个实现唯一的小缺点是会对同一个子串进行两次递归调用,对于超长字符串来说性能略有损耗,但如果严格遵守“无局部变量”的要求,这是目前最直接的实现方式。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

