这个递归程序中的这段代码发生了什么?

时间:2014-11-23 18:53:09

标签: java arrays recursion iteration

我正在完成一项任务,我在这里得到了一些帮助,其中包含了我需要的一段代码。该程序工作正常但只有一部分我不明白。

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似乎永远不会在代码中的任何地方递增。

如果我的问题提前混淆,我道歉。对此的任何解释都将非常感激。

1 个答案:

答案 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会在每次递归时分配一个新值。