Java 如何递归地找到链表中的最大值?
我需要递归地找到链表中的最大值,给定链表的头作为参数。我不知道如何开始该方法的递归部分。到目前为止,我只有这些Java 如何递归地找到链表中的最大值?,java,recursion,linked-list,Java,Recursion,Linked List,我需要递归地找到链表中的最大值,给定链表的头作为参数。我不知道如何开始该方法的递归部分。到目前为止,我只有这些 int maxOfList(List M){ List max = M; if(M == null) return max; if(M.next > max){ max = M.restOfTheInts; return maxOfList(); } } 在递归中,通常需要entry方法和wor
int maxOfList(List M){
List max = M;
if(M == null)
return max;
if(M.next > max){
max = M.restOfTheInts;
return maxOfList();
}
}
在递归中,通常需要entry方法和worker方法。entry方法是一种特殊情况,它允许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(int-currentMax,List-listToCheck){
//没什么可比的?就是它!
如果(listToCheck==null | | listToCheck.size()==0)返回currentMax;
//比较并返回。
List restOfList=listToCheck.subList(1,listToCheck.size());
返回maxOfList(Math.max(currentMax,listToCheck.get(0)),restOfList);
}
然后,要开始,您需要您的输入方法:
int maxOfList(List<int> listToCheck) {
return maxOfList(Integer.MIN_VALUE, listToCheck);
}
int-maxOfList(List-listToCheck){
返回maxOfList(Integer.MIN_值,listToCheck);
}
在递归中,通常需要一个entry方法和一个worker方法。entry方法是一种特殊情况,它允许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(int-currentMax,List-listToCheck){
//没什么可比的?就是它!
如果(listToCheck==null | | listToCheck.size()==0)返回currentMax;
//比较并返回。
List restOfList=listToCheck.subList(1,listToCheck.size());
返回maxOfList(Math.max(currentMax,listToCheck.get(0)),restOfList);
}
然后,要开始,您需要您的输入方法:
int maxOfList(List<int> listToCheck) {
return maxOfList(Integer.MIN_VALUE, listToCheck);
}
int-maxOfList(List-listToCheck){
返回maxOfList(Integer.MIN_值,listToCheck);
}
因此,为了使递归有效地工作,您需要使整个上下文在函数中可见
int maxOfList(List m) {
if(m.next == null)
return m;
int previousMax = maxOfList(m.next);
if(m > previousMax)
return m;
else
return previousMax;
}
因此,为了使递归有效地工作,您需要使整个上下文在函数中可见
int maxOfList(List m) {
if(m.next == null)
return m;
int previousMax = maxOfList(m.next);
if(m > previousMax)
return m;
else
return previousMax;
}
这应该非常简单。为了实现递归解决方案,请考虑以下所有步骤:
- 递归思想是什么?列表的最大值
是{L}
,其中max(li,{L}-li)
是当前元素李>li
- 什么是停止条件?我们知道,如果列表为空,最大值可能是任何数字都会更大的值,比如说
李>MIN_INT
- 综合起来:因此,最后我们可以说伪代码如下所示:
int最大值列表(列表M){
如果(M==null)
返回Integer.MIN_值;
int max=maxOfList(M.next);
返回M.value>max?M.value:max;
}
我假设链表的内容在value
中,并指向next
中的下一个元素(尾部指向null
)。如果您发现任何其他问题,请查看以下帖子:
这应该非常简单。为了实现递归解决方案,请考虑以下所有步骤:
- 递归思想是什么?列表的最大值
是{L}
,其中max(li,{L}-li)
是当前元素李>li
- 什么是停止条件?我们知道,如果列表为空,最大值可能是任何数字都会更大的值,比如说
李>MIN_INT
- 综合起来:因此,最后我们可以说伪代码如下所示:
int最大值列表(列表M){
如果(M==null)
返回Integer.MIN_值;
int max=maxOfList(M.next);
返回M.value>max?M.value:max;
}
我假设链表的内容在value
中,并指向next
中的下一个元素(尾部指向null
)。如果您发现任何其他问题,请查看以下帖子:
到目前为止,您所拥有的内容是否适用于长度为1的列表?如果没有,不要尝试考虑递归的情况。(提示:不,不适用)到目前为止,您所拥有的内容是否适用于长度为1的列表?如果没有,不要尝试考虑递归的情况。(提示:不,它不是)这真的只需要作为一个优化,如果它将是尾部调用优化。没有尾部调用优化,就不需要助手方法。这是一个原因。另一个原因是递归方法的签名几乎总是带有一个仅用于递归的参数。在本例中,
currentMax
是一个公共API不需要知道的参数。我的观点是,您根本不需要该参数,因此也不需要帮助器。递归调用只是返回max(node.value,maxOfList(node.tail))
很好。我想我对列表为null或为空是特别防御性的。如果它是尾部调用优化的,那实际上只需要作为优化。没有尾部调用优化,就不需要助手方法。这是一个原因。另一个原因是递归方法的签名几乎总是带有一个仅用于递归的参数。在本例中,currentMax
是一个公共API不需要知道的参数。我的观点是,您根本不需要该参数,因此也不需要帮助器。递归调用只是返回max(node.value,maxOfList(node.tail))
很好。我想我对列表为null或为空的问题特别谨慎。您可能需要提供一个list.next
的实现来充分解释这一点。Paul同意。我的答案只是一个简单的算法解决方案。在我看来,Java语言的实现应该留给cee来让他有效地理解递归。您可能需要提供列表的实现。接下来
来充分解释这一点。Paul同意。我的回答只是简单的回答