Java递归 - 在数组中查找最小数字索引

时间:2015-09-16 20:54:58

标签: java arrays recursion

我正在学习java中的递归,但是我在查找数组中最小元素的索引时遇到了麻烦。所以我需要一些帮助..如果你对递归有一些很好的解释请发表评论

2 个答案:

答案 0 :(得分:2)

我将提供一个递归的通用模板,而不是发布您的问题的答案。然后,您应该尝试并在有特定问题时回来。

通常,递归方法遵循以下形式:

private Result recursiveMethod(Context current) {
    if (current.isInSimpleFormWithObviousAnswer()) {
        return new Result(current.getValue());
    } else {
        Result result = new Result(current.getValue());
        for (Context reducedContext: current.possibleReducedContexts()) {
            result = result.possiblyCombine(recursiveMethod(reducedContext)));
        }
        return result;
    }
}

这是一般形式。在许多情况下,您不需要ResultContext类,因为您将使用某种原始类型或集合。在许多情况下,递归调用不是迭代,因为只有一个可能的“简化上下文”。在你的情况下,这两种情况都是正确的。

答案 1 :(得分:0)

与数组上的大多数递归算法一样,您有:

  • 基本情况,其中(剩余)数组的长度为零;和
  • 迭代案例:其中长度为 n 的数组的问题部分通过求解长度为 n-1 或 n / 2 ;或另一种细分方式。

让我们谈谈分而治之的方式: n / 2 。首先,我们将索引范围附加到数组。这些索引指定数组中我们开始和结束的位置。这比将数组(部分)有效地复制到另一个数组中更有效:

public static int minimum (int[] values) {
    return minimum(values,0,values.length);
}

被调用的minimum将是递归函数。

现在对于递归函数有两种情况:

  • 在数组长度为1的情况下,只需返回该元素(1);或
  • 如果数组有更多元素,将其细分为两个大小相等的子数组,计算它们的最小值,并返回两者中的最小值(2)。

或代码:

public static int minimum (int[] value, int frm, int to) {
    if(to-frm <= 1) {//(1)
        return value[frm];
    } else {         //(2)
        int mid = (frm+to)/2;
        int m1 = minimum(value,frm,mid);
        int m2 = minimum(value,mid,to);
        return Math.min(m1,m2);
    }
}

jDoodle demo

TODO:现在您只需将其翻译为让返回最小元素的索引而不是元素本身。