【问题标题】:Java: Recursively Finding the minimum element in a listJava:递归查找列表中的最小元素
【发布时间】:2013-03-17 01:35:41
【问题描述】:

我会先说这是家庭作业。我只是在寻找一些指示。我一直在用这个来绞尽脑汁,而对于我的一生,我就是不明白。我们被要求找到列表中的最小元素。我知道我需要一个子列表,但在那之后我不确定。任何指针都会很棒。谢谢。

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

【问题讨论】:

  • 请记住,您必须在某个时候进行比较。
  • 会很贵,买为什么不说如果元素0小于元素1,则返回删除1的列表的最小值,否则返回删除0的列表的最小值
  • 基于前两个 cmets 的另一个提示...也许您应该有另一个基本情况,其中列表的大小为 2。在这种情况下,您将返回两个元素中较小的一个。否则,您会将第一个元素与“列表的其余部分”中的最小元素进行比较。
  • 是的,我知道这是功课,忍不住说总是有Math.min() .. :-)

标签: java list recursion minimum


【解决方案1】:
/**
 * The function computes the minimum item of m (-1 if m is empty). 
 * @param m: The MyList we want to compute its minimum item.
 * @return: The minimum item of MyList    
 */ 
public int minimum(MyList<Integer> m){

    int res = 0;
    int e0 = 0;
    int e1 = 0;

    // Scenarios Identification
    int scenario = 0;

    // Type 1. MyLyst is empty
    if(m.length() == 0) {
        scenario = 1;
    }else {
    // Type 2. MyLyst is not empty
        scenario = 2;
    }

    // Scenario Implementation
    switch(scenario) {

    // If MyLyst is empty
    case 1:
        res = -1;
        break;
        // If there is 1 or more elements   
    case 2:
        //1. Get and store first element of array
        e0 = m.getElement(0);
        //2. We remove the first element from MyList we just checked
        m.removeElement(0);
        //3. We recursively solve the smaller problem
        e1 = minimum(m); 
        //4. Compare and store results
        if(e0 < e1) {
            res = e0;
        }
        else {
            res = e1;
        }
        //5. Return removed element back to the array
        m.addElement(0, e0);
        break;
    }
    //6. Return result 
    return res;
}

【讨论】:

    【解决方案2】:

    你去,试试这个方法:

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

    希望这能解决您的问题。

    【讨论】:

      【解决方案3】:

      在最一般的意义上,递归是一个基于分解工作的概念,然后将较小的工作块委派给自己的副本。要使递归起作用,您需要三个主要的东西:

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

      在您的情况下,您正在尝试创建一个对列表进行操作的函数min。您认为您可以通过每次使列表变小一个(子列出第一个元素)以某种方式减少(分解)您的工作是正确的。正如其他人所提到的,这个想法是根据“列表的其余部分”检查第一个元素(您刚刚提取的)。好吧,这就是信仰飞跃的地方。此时,您可以“假设”您的min 函数将在子列表上运行,并且只需对子列表进行函数调用(递归调用)。现在你必须确保你所有的调用都会返回(即确保它不会永远递归)。这就是你的基本情况出现的地方。如果你的列表大小为 1,则唯一的元素是列表中最小的元素。无需再次致电min,只需返回(您在原始帖子中已有的部分)。

      【讨论】:

      • “递归是一个基于分解工作的概念” --> 也称为“分而治之”策略。
      【解决方案4】:

      你需要找出应用于列表的函数 min 和应用于子列表的函数 min 之间的关系。

      min([a b c d e ...]) = f(a, min([b c d e ...]))

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

      【讨论】:

        【解决方案5】:

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

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

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

        考虑到这些,应该很容易实现。尤其是因为递归算法具有与其算法描述非常相似的便利性。

        【讨论】:

          猜你喜欢
          • 2018-06-13
          • 1970-01-01
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          • 1970-01-01
          • 2020-11-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多