Java递归方法中使用--i与i-1为何输出结果不同?
递归方法中
--i1与i1-1的差异分析 我编写了两个递归方法,二者的区别仅在于一处使用--i1,另一处使用i1-1,但运行后输出结果不同。
测试代码如下:
String s1 = "axbdcg"; String s2 ="aazzzzzzzzzzzzcbc"; System.out.println(method(s1,s2,s1.length()-1,s2.length()-1));
第一个方法(输出结果为2):
int method(String s1, String s2, int i1, int i2){ if(s1.length() == 0 || s2.length() == 0) return 0; if(i1 < 0|| i2 < 0) return 0; if(s1.charAt(i1) == s2.charAt(i2)) return 1+ method(s1,s2,--i1,--i2); int left = method(s1,s2,--i1,i2); int right = method(s1,s2,i1,--i2); return Math.max(left ,right); }
第二个方法(输出结果为3):
int method(String s1, String s2, int i1, int i2){ if(s1.length() == 0 || s2.length() == 0) return 0; if(i1 < 0|| i2 < 0) return 0; if(s1.charAt(i1) == s2.charAt(i2)) return 1+ method(s1,s2,--i1,--i2); int left = method(s1,s2,i1-1,i2); int right = method(s1,s2,i1,--i2); return Math.max(left ,right); }
差异原因分析
核心区别在于--i1是前置自减运算符,而i1-1是普通算术表达式:
--i1会直接修改当前方法栈中i1变量的原始值:先把i1减1,再将减后的值传递给递归调用。i1-1仅计算出一个临时数值传递给递归调用,不会改变当前方法中i1的原始值。
具体到第一个方法的执行逻辑:
当执行int left = method(s1,s2,--i1,i2);时,i1已经被减1,后续执行int right = method(s1,s2,i1,--i2);时,传入的i1是修改后的减后值。这就导致right分支的递归调用跳过了s1当前位置的字符,少遍历了一部分可能的匹配路径,最终得到的最长公共子序列长度偏小(输出2)。
第二个方法中,left分支用i1-1传递参数,当前方法的i1值保持不变,后续right分支传入的i1还是方法最初的原始值,保证了两个分支的递归调用都基于当前层的初始索引遍历所有可能路径,因此得到了正确的最长公共子序列长度(输出3)。
总结:--i1会改变当前变量状态,影响后续代码的变量值;i1-1仅传递临时计算值,不干扰原变量,逻辑更符合递归分支的预期。
内容的提问来源于stack exchange,提问作者DARK FOREST
相关产品推荐
相关产品推荐

