【问题标题】:Reset a counter in recursive methods在递归方法中重置计数器
【发布时间】:2019-11-30 17:46:12
【问题描述】:

我正在尝试编写一个递归方法,它为我提供了数组中整数(邻居)的最大和对。它运行良好,但仅适用于第一次运行,因为如果当前总和大于先前运行的最大总和,我无法重置我用来检查的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 是我想要在结果战争返回后重置的变量

标签: java arrays recursion static


【解决方案1】:

一个非常简单的方法是:

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

希望这有帮助!

【讨论】:

  • 感谢您的帮助 :) 它与 tempMaxSum 完美配合,即使它不是我想要的 :) 有一个很好的
  • 太棒了!很高兴你找到了另一个好方法!我尝试制作我的,这样您就不必更改太多代码,但您肯定找到了更好的方法!此外,如果您愿意,为了让 stackoverflow 知道这个问题不再需要任何答案,您可以将这个问题的 3 个答案之一设置为答案,(或投票赞成)! :)
【解决方案2】:

感谢您的帮助!我决定编写一个新代码,它完美运行并且是递归的: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));

【讨论】:

    【解决方案3】:

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

    这里应该使用大于运算符的传递性,所以无论它在列表中何时发生,最大值都将是最大的,所以我们何时找到它并不重要。如果不清楚,请尝试提出一些具体的示例并遍历您的方法的几次迭代。

    它被传递到递归堆栈的一个例子是向你的方法添加一个新参数,例如“maxSum”并将其传递给每个调用,跟踪每次调用的最大值。但是,从这里返回仍然会感觉有点“偏离”,因为一旦到达列表的末尾,您就会获得结果的值,但是仍然需要通过您对方法,直到它回到第一次调用。

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

    这里,比较是 Math.max(currentSum, nextSum),其中 currentSum = workArray[i] + workArray[i+1] 并且 nextSum 是下一次调用 getMaxPairSum 返回的值,实际上不会直到你到达数组的末尾(递归的终止情况)才被确定,它将返回一个值给它之前的调用,它返回一个值给它之前的调用,它返回一个值给它之前的调用,依此类推,直到您返回第一个调用并获得最终值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多