在递归方法中重置计数器

问题描述 投票:0回答:3

我正在尝试编写一种递归方法,该方法为我提供了数组中整数(邻居)的最大和对。它运行良好,但仅适用于第一次运行,因为如果当前总和大于先前运行的最大总和,则我无法重置用于检查的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;
}
java arrays recursion static
3个回答
0
投票

一种非常简单的方法可以是:

  • 创建临时变量
  • 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;

希望这有所帮助!


0
投票

谢谢您的帮助!我决定编写一个新代码,它可以完美运行并且是递归的:D

私有静态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));

0
投票

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

应该是大于运算符的可传递性在这里适用,因此无论列表何时出现,最大值都将是最大,因此,当我们找到它时,它并不重要。尝试提出一些具体的示例,并在不确定的情况下逐步迭代您的方法。

将其传递到递归堆栈的示例是向您的方法添加一个新参数,例如“ maxSum”,并将其传递给每个调用,并跟踪每个调用的max。不过,从此返回仍然会感觉有些“偏离”,因为一旦到达列表的末尾,您便拥有了结果的价值,但随后仍然需要通过对您进行的所有递归调用将其返回方法,直到返回到第一个调用。

这里,“最递归”的方法是让您的方法使用尚未确定但知道会在将来确定的值,并一直执行到最终情况为止。一旦到达末尾,它将获得一个具体值,该值允许现在确定上一个呼叫的不确定值,从而可以确定之前的呼叫的不确定值,等等,直到第一次呼叫。

这里,比较将是Math.max(currentSum,nextSum),其中currentSum = workArray [i] + workArray [i + 1],nextSum是下一次对getMaxPairSum的调用返回的值,实际上不会是确定,直到到达数组的末尾(递归的终止情况),该数组才会向该数组的前面的调用返回一个值,该数组将返回一个值到该数组之前的调用,向该数组的前面的调用返回一个值,依此类推,直到您返回第一个电话,然后才有了最终值。

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

© www.soinside.com 2019 - 2024. All rights reserved.