You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求无局部变量的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);
}

逻辑解释

每一步都完全依赖递归和条件判断,没有使用任何局部变量:

  1. Base Case 1:如果输入字符串为空,直接返回-1——空字符串不可能包含任何字符。
  2. Base Case 2:如果字符串的第一个字符就是目标字符,返回0——这是我们要找的第一个匹配位置。
  3. 递归逻辑:如果前两个条件都不满足,就递归搜索去掉第一个字符的子串。如果子串的递归结果是-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:17:57