【问题标题】:what is happening to this piece of code in this recusion program?这个递归程序中的这段代码发生了什么?
【发布时间】:2015-01-21 11:03:43
【问题描述】:

我正在处理一项任务,在这里我得到了帮助,其中包含我需要的一段代码。该程序运行良好,但只有一部分我不明白。

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 似乎从未在代码中的任何地方递增。

如果我的问题事先令人困惑,我深表歉意。对此的任何解释将不胜感激。

【问题讨论】:

    标签: java arrays recursion iteration


    【解决方案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 在每次递归时都会被分配一个新值。

    【讨论】:

    • 首先感谢您如此迅速的回复。其次,我很抱歉,但我仍然看不到它从 0 增加 maxIndex 的位置。我看到“i”增加了,但只有当等于语句为真(我的理解不正确)并且没有添加任何内容时才使用 maxIndex .
    • 我添加了一个很长的解释,希望对您有所帮助。即使您的代码没有理由递归,并且如果以迭代方式编写它会更容易理解。理解递归期间发生的事情仍然很好。
    猜你喜欢
    • 2016-06-09
    • 2018-07-28
    • 1970-01-01
    • 2012-08-29
    • 2014-11-12
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多