递归:这个程序如何工作?

时间:2016-11-07 01:27:41

标签: arrays recursion

我正在做递归练习,我理解它的基础知识。但这一次练习让我陷入困境,我不知道它是如何得到它的输出的。这是:

public class MinIndex_rec
{
   public static void main(String[] args)
   {
      int[] a = {1, -16, -3, 4, -5, -12, -17};
      System.out.println("The Min value index is: " + MinIndex(a, a.length - 1));
   }

   public static int MinIndex(int[] x, int n)
   {
      if(n == 0)
         return n;

      int index = MinIndex(x, n-1);

      if(x[index]<x[n])
      {
         System.out.println(x[index] + "\t" + x[n] + "\t" + index + "\t" + n);
         return index;
      }

      else
         return n;     
   }
}

输出结果为:

-16 -3 1 2
-16 4 1 3
-16 -5 1 4
-16 -12 1 5
The Min value Index is: 6

我对它如何得到输出一无所知。我将不胜感激任何帮助!

2 个答案:

答案 0 :(得分:0)

该方法以递归方式查找数组中索引最低的项目。

该方法接受两个参数 - 要检查的数组及其最大索引。然后它递归地调用自己在该数组的子集上 - 基本上一个元素更短。它使用结果将返回位置的元素与最高位置的元素(递归调用评估中未包含的元素)进行比较。根据最高位置的元素是否更大,它返回最高位置作为最大元素的索引或从子集返回的原始索引。

示例中的前四行只返回临时结果,即原始数组子集的最大元素索引 - 第一个元素,前三个元素,前四个元素等。

仅当最高值未更改时才会打印此调试消息。所以在这个具体的例子中,除了第一次和最后一次比较之外,它总是打印1,因为它没有变化。

答案 1 :(得分:0)

它是这样的:

x = {1, -16, -3, 4, -5, -12, -17};

MinIndex(x, 6)
  if(n == 0) => false
  index = MinIndex(x, 5)

    if(n == 0) => false
    index = MinIndex(x, 4)

    ...

      index = MinIndex(x, 0)      // this is called when n is 1, x[n] = -16
      if(n == 0) => true          // True here so return 0
        => index = 0
      if(x[0]<x[1]) => false      // False here so return n again to the call
                                  // when n was 2
        => index = 1
        => if(x[1]<x[2]) => TRUE
        => System.out.println(-16 + "\t" + -3 + "\t" + 1 + "\t" + 2);
        ...
        etc.