Java:递归查找列表中的最小元素

我将在前面说这是作业。 我只是在寻找一些指针。 我一直用这个来绞尽脑汁,而对于我的生活,我只是没有得到它。 我们被要求在列表中找到最小元素。 我知道我需要一个子列表,但在那之后我不确定。 任何指针都会很棒。 谢谢。

/** Find the minimum element in a list. * * @param ta list of integers * * @return the minimum element in the list */ public static int min(List t) { if (t.size() == 1){ return t.get(0); } else{ List u = t.subList(1, t.size()); 

在最普遍的意义上,递归是一个基于分解工作的概念,然后将较小的一部分工作委托给自己的副本。 对于递归工作,您需要三件事:

  1. 工作分解。 你如何使每一步“更简单”?
  2. 递归调用。 在某些时候,你的函数必须调用自己,但是“工作”更少。
  3. 基本情况。 什么是停止递归过程的(通常是微不足道的)结束案例?

在您的情况下,您正在尝试创建一个在列表上运行的函数min 。 你认为你可以通过每次缩小一个列表(第一个元素的子列表)来减少(分解)你的工作是正确的。 正如其他人所提到的那样,我们的想法是检查第一个元素(你刚刚推出)与“列表的其余部分”。 好吧,这就是信仰的飞跃。此时,您可以“假设”您的min函数将在子列表上工作,并且只需在子列表上进行函数调用(递归调用)。 现在你必须确保你的所有电话都会返回(即确保它不会永远递归)。 这就是你的基础案例的来源。如果你的列表大小为1,那么唯一的元素就是列表中最小的元素。 无需再次呼叫min ,只需返回(您原来的post中已有的那部分)。

递归算法的要点是必须计算的所有内容都是通过返回值或其他参数完成的。 你不应该在递归步骤的本地调用之外有任何东西。

由于您必须找到最小元素,因此您应该考虑以下因素:

  • 由一个元素组成的列表的min元素是该元素
  • 通用列表的min元素是剩余列表的第一个元素和最小元素之间的最小值

通过考虑这些因素,它应该易于实施。 特别是因为递归算法具有与其算法描述非常相似的便利性。

您需要找到应用于列表的函数min与应用于子列表的函数min之间的关系。

min([abcde …])= f(a,min([bcde …]))

现在你只需要找到函数f。 一旦你有了这段关系,那么实施它很容易。 祝你好运。

你去,在方法中试试这个:

  public static Integer minimum(List t) { int minInt; if (t.size() == 1) { return t.get(0); } else { int first = t.get(0); List u = t.subList(1, t.size()); minInt = Math.min(first, u.get(0)); minInt = IntegerList.minimum(u); } return minInt; } 

希望这能解决您的问题。