递归中前后置自增运算符失效?为何depth始终输出0?
递归中自增运算符未生效的原因解析
先看你提供的代码:
public static void main(String[] args){ Screen.clear(); System.out.println(depth(5,0)); } public static int depth(int n, int depth){ System.out.println(depth); if(n == 0)return depth; else{ System.out.println(depth); return depth(n-1, depth++); } }
核心问题:后置自增运算符的执行逻辑
你使用的depth++是后置自增运算符,它的执行顺序是:
- 先返回变量
depth的当前值(也就是0)作为参数传递给下一层递归; - 完成参数传递后,才对当前方法内的
depth变量执行自增操作。
但Java的方法参数是值传递,下一层递归的depth是独立的局部变量,当前层的depth自增完全不会影响下一层。所以每一次递归调用,传递的都是原始的0,导致每一层输出的depth都是0,最终返回值也是0。
前置自增也不是最优解
如果换成前置自增++depth,确实会先自增再传递值,下一层能拿到递增后的数值,但这种写法容易混淆——因为当前层的depth变量和下一层的是完全独立的,自增操作只是在当前层修改了局部变量,再把新值传进去,本质和直接传depth+1没有区别,却多了变量修改的副作用。
正确的写法
最清晰且无歧义的方式是直接传递depth + 1,避免自增运算符的混淆:
public static int depth(int n, int depth){ System.out.println(depth); if(n == 0)return depth; else{ System.out.println(depth); return depth(n-1, depth + 1); } }
这样每一层递归都会拿到上一层depth加1后的新值,输出会依次是0、0、1、1、2、2、3、3、4、4、5,最终返回5,符合预期。
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

