有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在递归方法中重置计数器

我正在尝试编写一个递归方法,该方法给出数组中整数(邻居)的最大和对。它工作得很好,但只适用于第一次运行,因为如果当前和大于以前运行的最大和,我无法重置用于检查的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;
}

共 (3) 个答案

  1. # 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;
    

    希望这有帮助

  2. # 2 楼答案

    谢谢你的帮助!我决定写一个新的代码,它可以完美地工作,并且是递归的:D

    私有静态int getMaxPairSum(int[]工作数组,int开始,int结束){

        if (start==end)
            return 0;
    
        return Math.max((workArray[start] + workArray[start+1]), getMaxPairSum(workArray,start+1,end));
    
  3. # 3 楼答案

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

    应该是这样的情况,大于运算符的传递性在这里适用,所以无论它在列表中何时发生,max都将是最大的,所以我们何时找到它并不重要。如果不清楚的话,试着给出一些具体的例子,并对你的方法进行一些迭代

    向递归堆栈上传递的一个例子是向方法中添加一个新参数,例如“maxSum”,并将其传递给每个调用,跟踪每个调用的最大值。尽管如此,从这里返回仍然会感觉有点“关闭”,因为一旦到达列表的末尾,您就可以得到结果的值,但是仍然需要通过对该方法进行的所有递归调用返回结果,直到它返回到第一个调用为止

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

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

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