Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在递归方法中重置计数器_Java_Arrays_Recursion_Static - Fatal编程技术网

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

Java 在递归方法中重置计数器,java,arrays,recursion,static,Java,Arrays,Recursion,Static,我正在尝试编写一个递归方法,该方法给出数组中整数(邻居)的最大和对。它工作得很好,但只在第一次运行时,因为我无法重置我的静态int-maxSum“计数器”,用于检查当前和是否大于以前运行的最大和。也许你可以给我一个提示,这是我第一次在递归中使用静态计数器 static int maxSum=0; 私有静态int getMaxPairSum(int[]工作数组,int开始,int结束){ while(开始最大和){ maxSum=workArray[start]+workArray[start+1

我正在尝试编写一个递归方法,该方法给出数组中整数(邻居)的最大和对。它工作得很好,但只在第一次运行时,因为我无法重置我的
静态int-maxSum“计数器”,用于检查当前和是否大于以前运行的最大和。也许你可以给我一个提示,这是我第一次在递归中使用静态计数器

static int maxSum=0;
私有静态int getMaxPairSum(int[]工作数组,int开始,int结束){
while(开始<结束){
if(工作阵列[start]+工作阵列[start+1]>最大和){
maxSum=workArray[start]+workArray[start+1];
返回getMaxPairSum(工作数组,开始+1,结束);
}
否则返回getMaxPairSum(工作数组,开始+1,结束);
}
返回最大和;
}

一个非常简单的方法是:

  • 创建临时变量
  • maxSum
    的值赋给变量
  • 重置
    maxSum
  • 返回临时变量
会是这样的:

while(开始<结束){
if(工作阵列[start]+工作阵列[start+1]>最大和){
maxSum=workArray[start]+workArray[start+1];
返回getMaxPairSum(工作数组,开始+1,结束);
}
否则返回getMaxPairSum(工作数组,开始+1,结束);
}
int tempMaxSum=maxSum;
最大和=0;
返回tempMaxSum;

希望这有帮助

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

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

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

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

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


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

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

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


哪一个是你想要重置的变量?
maxSum
?是的,maxSum是我在结果战返回后想要重置的变量谢谢你的帮助:)它与tempMaxSum完美配合,尽管它不是我想要的:)有一个好的方法很棒!很高兴你找到了另一个好的方法!我尝试了我的方法,这样你就不会必须更改太多的代码,但您肯定找到了更好的方法!此外,如果您想让stackoverflow知道此问题不需要更多答案,您可以将此问题的3个答案中的一个设置为答案(或向上投票)!:)
    if (start==end)
        return 0;

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