【发布时间】:2015-09-16 20:54:58
【问题描述】:
我正在学习 java 中的递归,但是在查找数组中最小元素的索引时遇到了麻烦。所以我需要一些帮助。如果您对递归有一些很好的解释,请发表评论。
【问题讨论】:
-
发布您尝试的代码 sn-p,然后我们可以从那里帮助您。
-
在 SO 上,人们需要展示“一些研究工作”...展示您尝试过的内容、失败的内容等。
我正在学习 java 中的递归,但是在查找数组中最小元素的索引时遇到了麻烦。所以我需要一些帮助。如果您对递归有一些很好的解释,请发表评论。
【问题讨论】:
我将提供一个通用的递归模板,而不是发布您的问题的答案。然后,您应该尝试一下,并在您有特定问题时回来。
一般而言,递归方法遵循以下形式:
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;
}
}
这是一种通用形式。在许多情况下,您不需要 Result 和 Context 类,因为您将使用一些原始类型或集合。在许多情况下,递归调用不是迭代,因为只有一个可能的“简化上下文”。这两种情况在你的情况下都是正确的。
【讨论】:
result = result.possibleCombine(...) 允许继承Result 类:)。
与大多数数组递归算法一样,您有:
我们来谈谈分而治之的方式:n/2。首先,我们将一个索引范围附加到数组。这些索引指定我们在数组中开始和结束查找的位置。这比有效地将一个数组(部分)复制到另一个数组中更有效:
public static int minimum (int[] values) {
return minimum(values,0,values.length);
}
其中被调用的minimum 将是递归函数。
现在对于递归函数有两种情况:
或者在代码中:
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);
}
}
TODO:现在您只需翻译它,让它与返回最小元素的索引一起工作,而不是元素本身。
【讨论】: