Java递归函数中变量递增失败求助:传参及全局变量均无效
解决Java递归中变量s无法递增的问题
嘿,我一眼就看出你这里的核心问题——Java是严格的值传递,你在递归调用里传的s其实是当前值的副本,递归内部修改这个副本根本不会影响外层方法里的s变量。而且看你的代码还有几个逻辑小问题,比如分支里给resultado赋值了,但最后返回的却是s,这明显和你想要的逻辑不符啊。
先给你拆解下代码里的关键问题:
- 每次递归调用
p(m-1,p,t,s)时,传递的是当前s的数值,递归栈里的方法拿到的是这个值的拷贝,不管里面怎么修改s,外层的s都不会发生变化。 - 你在每个分支开头都做了
s++,但这个自增只作用于当前方法栈的s变量,递归调用的子方法根本拿不到这个自增后的值的后续变化(除了传递那一刻的数值)。 - 最后返回
s的逻辑完全忽略了分支里赋值的resultado,这肯定不是你原本想要的结果。
那怎么解决呢?给你两个实用的方案:
方案一:用可变容器包裹s(快速修改版)
因为Java里对象是引用传递,我们可以用一个长度为1的int数组来存s,这样递归里修改数组的元素时,所有栈帧都能看到这个变化。修改后的代码如下:
// 把参数p改名为pVal,避免和方法名混淆 public static int p(int m, int pVal, int t, int[] sContainer) { int resultado; // 每次进入方法先递增计数 sContainer[0]++; if (m == 0) { resultado = sContainer[0]; } else if (m == 1) { resultado = t; } else { resultado = 2 * p(m-1, pVal, t, sContainer) + p(m-2, pVal, t, sContainer); } // 返回你需要的计算结果resultado,而非计数s return resultado; }
调用时初始化容器即可:
int[] sContainer = {0}; int calcResult = p(5, 2, 3, sContainer); System.out.println("递归计算结果:" + calcResult); System.out.println("s的累计递增次数:" + sContainer[0]);
方案二:自定义返回类型(规范可读版)
如果你的逻辑需要同时返回递归计算结果和s的计数,可以自定义一个类来封装这两个值,代码可读性会更高:
// 自定义返回类,同时封装计算结果和计数 static class RecursionResult { int calcValue; int count; RecursionResult(int calcValue, int count) { this.calcValue = calcValue; this.count = count; } } public static RecursionResult p(int m, int pVal, int t) { if (m == 0) { // m=0时,计数+1,计算值为当前计数 return new RecursionResult(1, 1); } else if (m == 1) { // m=1时,计数+1,计算值为t return new RecursionResult(t, 1); } else { RecursionResult res1 = p(m-1, pVal, t); RecursionResult res2 = p(m-2, pVal, t); // 当前层计数=自身1次 + 两次递归的计数总和 int totalCount = 1 + res1.count + res2.count; // 当前层计算值=2*前一次结果 + 前两次结果 int totalValue = 2 * res1.calcValue + res2.calcValue; return new RecursionResult(totalValue, totalCount); } }
调用时直接获取两个值:
RecursionResult finalResult = p(5, 2, 3); System.out.println("递归计算结果:" + finalResult.calcValue); System.out.println("s的累计递增次数:" + finalResult.count);
这两个方案都能解决你s无法递增的问题,方案一更适合快速调整现有代码,方案二更适合大型项目,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Gabriel de Oliveira Sousa
相关产品推荐
相关产品推荐

