【问题标题】:Java recursion-finding the minimal number index in array [closed]Java递归查找数组中的最小数字索引[关闭]
【发布时间】:2015-09-16 20:54:58
【问题描述】:

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

【问题讨论】:

  • 发布您尝试的代码 sn-p,然后我们可以从那里帮助您。
  • 在 SO 上,人们需要展示“一些研究工作”...展示您尝试过的内容、失败的内容等。

标签: java arrays recursion


【解决方案1】:

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

一般而言,递归方法遵循以下形式:

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 类,因为您将使用一些原始类型或集合。在许多情况下,递归调用不是迭代,因为只有一个可能的“简化上下文”。这两种情况在你的情况下都是正确的。

【讨论】:

  • 也许result = result.possibleCombine(...) 允许继承Result 类:)。
  • @CommuSoft 好建议。将添加该
【解决方案2】:

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

  • 基本情况,其中(剩余)数组的长度为零;和
  • 迭代案例:长度为 n 的数组的问题可以通过解决长度为 n-1 的数组来部分解决em>n/2;或其他细分方式。

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

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

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

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

  • 如果数组的长度为一,则只需返回该元素 (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:现在您只需翻译它,让它与返回最小元素的索引一起工作,而不是元素本身。

【讨论】:

  • 我想你可能刚刚完成了 OP 的作业 ;-)
  • @sprinter:这个问题似乎建议返回 index,所以如果 OP 可以设法将其翻译为使用索引,我认为他/她理解它; )。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2018-10-31
  • 1970-01-01
  • 2017-09-25
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多