我正在完成一项任务,我在这里得到了一些帮助,其中包含了我需要的一段代码。该程序工作正常但只有一部分我不明白。
public class largest_in_array
{
public static void main(String[] args)
{
int array [] = {23,35,67,76,34};
System.out.println("The largest number in the array is: ");
System.out.println(array[largest(array, 0, 0)]);
}
public static int largest(int array[], int maxIndex, int i)
{
int ans = 0;
if(i == array.length-1)
{
ans = maxIndex;
}
else
{
ans = largest(array, (Math.max(array[maxIndex], array[i]) == array[maxIndex]) ? maxIndex : i, ++i);
}
return ans;
}
}
我不明白的部分是:
ans = largest(array, (Math.max(array[maxIndex], array[i]) == array[maxIndex]) ? maxIndex : i, ++i);
似乎maxIndex从0开始,然后在第三个递归步骤附近获得值1.我不知道这是怎么发生的,因为maxIndex似乎永远不会在代码中的任何地方递增。
如果我的问题提前混淆,我道歉。对此的任何解释都将非常感激。
答案 0 :(得分:1)
这是一个递归函数,所以每次调用它自己。调用函数时,会为函数的参数创建新变量,并为它们分配参数值。也就是说,如果你有一个功能:
int someFunction(int x)
{
// do something with x
}
你称之为:
someFunction(3)
然后创建一个新变量x
(在调用堆栈上)并赋值3
。
在递归调用中会发生完全相同的事情。所以如果someFunction自己调用:
int someFunction(int x)
{
if (x < 10) {
someFunction(x+1);
}
}
然后在每次调用时创建一个名为x
的新变量,并为其分配值x+1
。也就是说,在每次调用时,参数值都比以前高一个。
您的代码也会发生同样的情况。在每次递归调用时,将在堆栈上创建一组新参数,并从函数调用的参数中为它们分配值。也就是说,每次递归调用都会执行以下分配:
array = array
maxIndex = (Math.max(array[maxIndex], array[i]) == array[maxIndex]) ? maxIndex : i
i = ++i
因此,maxIndex
会在每次递归时分配一个新值。