在递归方法中重置计数器



我正在尝试编写一个递归方法,该方法为我提供了数组中整数(邻居(的最大和对。它运行良好,但仅适用于第一次运行,因为我无法重置我用来检查的static int maxSum;"计数器",如果当前总和大于以前运行的最大总和。也许你可以给我一个提示,这是我第一次在递归中使用静态计数器

static int maxSum = 0;
private static int getMaxPairSum(int[] workArray, int start, int end) {
while(start < end){
if (workArray[start] + workArray[start+1] > maxSum){
maxSum = workArray[start] + workArray[start+1];
return getMaxPairSum(workArray,start +1,end);
}
else return getMaxPairSum(workArray,start +1,end);
}
return maxSum;
}

一个非常简单的方法是:

  • 创建临时变量
  • maxSum的值分配给变量
  • 重置maxSum
  • 返回临时变量

会是这样的:

while(start < end){
if (workArray[start] + workArray[start+1] > maxSum){
maxSum = workArray[start] + workArray[start+1];
return getMaxPairSum(workArray,start +1,end);
}
else return getMaxPairSum(workArray,start +1,end);
}
int tempMaxSum = maxSum;
maxSum = 0;
return tempMaxSum;

希望这有帮助!

谢谢你的帮助!我决定编写一个新代码,它运行良好并且是递归:D

private static int getMaxPairSum(int[] workArray, int start, int end( {

if (start==end)
return 0;
return Math.max((workArray[start] + workArray[start+1]), getMaxPairSum(workArray,start+1,end));

我觉得你仍然在迭代编程思维中想得太多。在递归中,您实际上不需要全局变量来跟踪更改。相反,更改应该向上(仍然非常迭代思维(或向下传播(正确的递归!(递归堆栈,并在该堆栈中的每个函数调用中执行操作(在本例中为比较(。

这里应该适用大于运算符的传递性,因此无论何时在列表中发生,最大值都将是最大的,因此当我们找到它时并不重要。尝试提出一些具体的例子,如果看起来不清楚,请浏览方法的几次迭代。

递归堆栈向上传递的一个例子是向方法添加一个新参数,例如"maxSum"并将其传递给每个调用,跟踪每次调用的最大值。不过,从中返回仍然会感觉有点"不对劲",因为一旦到达列表末尾,您就会拥有结果的值,但仍然需要通过您对该方法进行的所有递归调用来返回它,直到它返回到第一个调用。

在这里,"最递归"的方法是让你的方法使用尚未确定但知道将来会确定的值,并一直这样做,直到它达到最终情况。一旦到达终点,它将获得一个具体值,这允许现在确定上一个调用的未确定值,这允许确定之前的调用的未确定值,等等,直到第一次调用。

在这里,比较将是 Math.max(currentSum, nextSum(,其中 currentSum = workArray[i] + workArray[i+1] 和 nextSum 是下一次调用 getMaxPairSum 返回的值,直到您到达数组的末尾(递归的终止案例(才会真正确定该值,这将向它之前的调用返回一个值, in 向它之前的调用返回一个值,它向它之前的调用返回一个值,依此类推,直到你回到第一个调用,因此有你的最终值。

对于基于数据结构的可视化,这意味着计算将向下传播递归函数调用堆栈,直到第一次调用,这是堆栈中最底部的项目。

最新更新