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

递归实现外观数列第n项报错,求问题排查与修正方案

修复外观数列递归实现的错误

你的代码存在几个关键问题,导致运行报错或结果不正确,以下是问题分析和修正方案:

核心问题点

  • 递归无法终止:num(times--, y) 使用了后自减运算符--,会先传递当前times值再递减,导致递归次数始终不减少,最终触发栈溢出异常。需改为times-1直接传递递减后的数值。
  • 生成下一项的逻辑缺失:
    1. 初始计数错误:第一个字符的计数应从1开始(至少存在一个),而非0。
    2. 循环结束后未处理最后一组连续字符:遍历完成后,最后一组相同字符没有被追加到结果中,导致生成的项不完整。
  • 字符串拼接效率低下:使用String频繁拼接会创建大量临时对象,建议改用StringBuilder优化。

修正后的代码

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(num(n - 1, "1"));
        scan.close();
    }

    public static String num(int times, String x) {
        if (times == 0) {
            return x;
        }
        StringBuilder y = new StringBuilder();
        int counter = 1; // 初始计数为1,对应第一个字符
        char currentChar = x.charAt(0);

        for (int i = 1; i < x.length(); i++) {
            if (x.charAt(i) == currentChar) {
                counter++;
            } else {
                y.append(counter).append(currentChar);
                currentChar = x.charAt(i);
                counter = 1;
            }
        }
        // 处理最后一组未拼接的字符
        y.append(counter).append(currentChar);
        // 传递递减后的次数,确保递归能终止
        return num(times - 1, y.toString());
    }
}

修正说明

  1. 将times--改为times-1,确保每次递归的次数正确递减,触发终止条件。
  2. 初始化counter为1,对应第一个字符的初始计数逻辑。
  3. 使用StringBuilder替代String拼接,避免频繁创建对象,提升运行效率。
  4. 循环结束后追加最后一组字符,保证生成的下一项内容完整。

内容的提问来源于stack exchange,提问作者pinkbird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:35:26