【问题标题】:How to find the maximum value in a linked list recursively?如何递归地找到链表中的最大值?
【发布时间】:2016-03-23 02:54:56
【问题描述】:

我需要在给定链表的头部作为递归参数的情况下找到链表中的最大值。我不知道如何开始该方法的递归部分。这就是我到目前为止所拥有的。

int maxOfList(List M){  
    List max = M;
    if(M == null)
        return max;
    if(M.next > max){
        max = M.restOfTheInts;
        return maxOfList();
    }
}

【问题讨论】:

  • 到目前为止,您所拥有的内容是否适用于长度为 1 的列表?如果没有,甚至不要尝试考虑递归情况。 (提示:不,它没有)

标签: java recursion linked-list


【解决方案1】:

在递归中,你经常需要一个入口方法和一个工作者方法。入口方法是允许worker方法在所有情况下工作的特殊情况,并且worker进行递归。

例如,您的工人可能是这样的:

int maxOfList(int currentMax, List<int> listToCheck) {
  // Nothing to compare? currentMax is it!
  if (listToCheck == null || listToCheck.size() == 0) return currentMax;

  // Compare and return.
  List<int> restOfList = listToCheck.subList(1, listToCheck.size());
  return maxOfList(Math.max(currentMax, listToCheck.get(0)), restOfList);
}

然后要启动它,您需要输入方法:

int maxOfList(List<int> listToCheck) {
  return maxOfList(Integer.MIN_VALUE, listToCheck);
}

【讨论】:

  • 如果要进行尾调用优化,那真的只需要作为优化。没有尾调用优化,就不需要辅助方法。
  • 这是一个原因。另一个原因是递归方法的签名几乎总是带有一个仅用于递归的参数。在这种情况下,currentMax 是一个参数,而不是公共 API 不需要知道。
  • 我的意思是,您根本不需要参数,因此不需要帮助器。递归调用只是return max(node.value, maxOfList(node.tail))
  • 好点。我想我对 list 为 null 或为空的情况采取了额外的防御措施。
【解决方案2】:

因此,要使递归有效地工作,您需要让整个上下文在函数内部可见。

int maxOfList(List m) {
     if(m.next == null)
          return m;
     int previousMax = maxOfList(m.next);
     if(m > previousMax)
          return m;
     else
          return previousMax;
}

【讨论】:

  • 您可能需要提供List.next 的实现来充分解释这一点。
  • 同意保罗。我的回答只是一个算法解决方案。在我看来,Java 语言的实现应该留给 cee 让他有效地理解递归。
【解决方案3】:
int maxValue(List m){
   return maxValue(m, Integer.MIN_VALUE);
}

int maxValue(List m, int num){
  if(m.next == null){
     if(m.data > num)
     return num = m.data;
  }
  return maxValue(m.next, num);
}

【讨论】:

    【解决方案4】:

    这应该很简单。为了实现递归解决方案,请考虑所有这些步骤:

    • 递归思路是什么?列表{L}的最大值是max(Li, {L} - Li),其中Li是当前元素;
    • 停止条件是什么?我们知道,如果列表为空,则最大值可能是任何数字都更大的值,比如MIN_INT
    • 综合起来:所以,最后我们可以说伪代码如下所示:

    int maxOfList(List M) { if(M == null) return Integer.MIN_VALUE; int max = maxOfList(M.next); return M.value > max ? M.value : max; }

    我假设链表的内容在value 并指向next 中的下一个元素(尾部指向null)。如果您发现任何其他问题,请查看以下帖子:

    Finding Max value in an array using recursion

    Python: Recursive function to find the largest number in the list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多