我正在尝试编写一种递归方法,该方法为我提供了数组中整数(邻居)的最大和对。它运行良好,但仅适用于第一次运行,因为如果当前总和大于先前运行的最大总和,则我无法重置用于检查的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
私有静态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”,并将其传递给每个调用,并跟踪每个调用的max。不过,从此返回仍然会感觉有些“偏离”,因为一旦到达列表的末尾,您便拥有了结果的价值,但随后仍然需要通过对您进行的所有递归调用将其返回方法,直到返回到第一个调用。
这里,“最递归”的方法是让您的方法使用尚未确定但知道会在将来确定的值,并一直执行到最终情况为止。一旦到达末尾,它将获得一个具体值,该值允许现在确定上一个呼叫的不确定值,从而可以确定之前的呼叫的不确定值,等等,直到第一次呼叫。
这里,比较将是Math.max(currentSum,nextSum),其中currentSum = workArray [i] + workArray [i + 1],nextSum是下一次对getMaxPairSum的调用返回的值,实际上不会是确定,直到到达数组的末尾(递归的终止情况),该数组才会向该数组的前面的调用返回一个值,该数组将返回一个值到该数组之前的调用,向该数组的前面的调用返回一个值,依此类推,直到您返回第一个电话,然后才有了最终值。
对于基于数据结构的可视化,这意味着计算将沿递归函数调用堆栈向下传播,直到第一个调用,即堆栈中最底层的项。