在递归中为什么用 `int[]` 而不是 `int`?——揭秘 Java 参数传递的秘密

结论先抛出来:在 Java 里,基本类型参数总是"值传递",也就是说把原始值的拷贝给方法,你在子方法里改动那份拷贝,外层根本看不到;而把索引包装在 int[] 里,本质上是传了个可变对象引用,各层递归共同操作这张"共享定位图",才能让指针随着解析一路推进到终点。不信?一不小心就死循环,或者乱读、漏读都说不定。


当我们写那段经典的字符串解码递归

arduino 复制代码
private String decode(String s, int[] idx) {
    // idx[0] 每一步都在变,子层递归里 idx[0]++ 外层也跟着"长"。
    ...
}

就像给所有递归层都挂了一块操作面板------指针 idx[0] 放在面板中央,谁改它一口气全网同步。相反,如果签名改成

arduino 复制代码
private String decode(String s, int idx) { ... }

每一次递归仅仅拿到 idx 的一个「快照」,你无论在子方法里把 idx 走到多远,回到上层还是旧值,加不上子层解析的进度,最后肯定是字符串没读完、指针卡在老地方副本......报错、死循环,乐意当大胖蛀虫?


打个生活中的比喻:想象你和好友一起画长长的蛇,起点在 0,终点未知。你用纸条 互相传递当前位置(int idx),每传一次对方拿到的还是纸条里原先的数字,哪怕你在纸上写了新数字,自己手里那份还是旧的;但如果你们共同用一块白板int[] idx),谁在上面写"前进一格",大家立刻都能看到下一步要在画布哪里接着画。白板就是那个可以被多次修改、所有人都看见的"共享指针"。


除了参数传递机制,递归模板里用 int[] idx 还有个好处:简洁,不用为了"把子层进度带回来"专门搞返回值又解结构;只要在数组里改一把,递归结束自动沿着同一条时间线继续往后读。这种设计既保持了代码的清爽,又让逻辑一目了然。


小结一下:

想让方法之间共享可变指针,就别傻乎乎地拷贝一个 int;记住 Java 的「值传递」原则,把指针装进长度为 1 的数组或其它可变容器,才能让递归各层合股干活,一条不漏地把字符串给解码完。下次再写解码、换括号树的情境,一上手就秒懂这招,bug 自会乖乖退散~😊

相关推荐
master-dragon16 小时前
java log相关:Log4J、Log4J2、LogBack,SLF4J
java·log4j·logback
码事漫谈16 小时前
C++中虚函数与构造/析构函数的深度解析
后端
奔跑吧邓邓子16 小时前
【Java实战㉖】深入Java单元测试:JUnit 5实战指南
java·junit·单元测试·实战·junit5
百思可瑞教育17 小时前
Spring Boot 参数校验全攻略:从基础到进阶
运维·服务器·spring boot·后端·百思可瑞教育·北京百思教育
小O的算法实验室17 小时前
2024年ASOC SCI2区TOP,有效离散人工蜂群算法+变压器制造矩形切割问题,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
武子康17 小时前
大数据-89 Spark应用必备:进程通信、序列化机制与RDD执行原理
大数据·后端·spark
SheldonChang17 小时前
Onlyoffice集成与AI交互操作指引(Iframe版)
java·人工智能·ai·vue·onlyoffice·postmessage
shark_chili17 小时前
JITWatch实战指南:深入Java即时编译优化的黑科技工具
后端
数据爬坡ing17 小时前
C++ 类库管理系统的分析与设计:面向对象开发全流程实践
java·运维·开发语言·c++·软件工程·软件构建·运维开发
GEO_JYB17 小时前
从 MMLU 到 HumanEval:为什么评估大型语言模型(LLM)的基准至关重要?
人工智能·算法