递归实现外观数列第n项报错,求问题排查与修正方案
修复外观数列递归实现的错误
你的代码存在几个关键问题,导致运行报错或结果不正确,以下是问题分析和修正方案:
核心问题点
- 递归无法终止:
num(times--, y)使用了后自减运算符--,会先传递当前times值再递减,导致递归次数始终不减少,最终触发栈溢出异常。需改为times-1直接传递递减后的数值。 - 生成下一项的逻辑缺失:
- 初始计数错误:第一个字符的计数应从1开始(至少存在一个),而非0。
- 循环结束后未处理最后一组连续字符:遍历完成后,最后一组相同字符没有被追加到结果中,导致生成的项不完整。
- 字符串拼接效率低下:使用
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()); } }
修正说明
- 将
times--改为times-1,确保每次递归的次数正确递减,触发终止条件。 - 初始化
counter为1,对应第一个字符的初始计数逻辑。 - 使用
StringBuilder替代String拼接,避免频繁创建对象,提升运行效率。 - 循环结束后追加最后一组字符,保证生成的下一项内容完整。
内容的提问来源于stack exchange,提问作者pinkbird
相关产品推荐
相关产品推荐

