![](/img/trans.png)
[英]Finding the minimum of a nested list that has a constant in element[1]
[英]Finding minimum element in a list (recursively) - Python
我正在尝试使用递归在整数列表中找到最小值。 主要思想是,如果列表只有一个元素长,则此元素是我的最小值。 否则,我将列表分成两个相同大小的较小列表,在两个列表中寻找最小值,然后比较哪个较小。 代码如下:
def minimum(a,l,p):
if l == p:
return a[l]
else:
m1 = minimum(a,l, (l+p)/2)
m2 = minimum(a, (l+p)/2 + 1, p)
if m1 < m2:
return m1
else:
return m2
似乎并不困难,但是当我尝试为示例列表运行此功能时,出现以下错误:“ RecursionError:在比较中超出了最大递归深度 ”。 算法有问题吗,或者出于这个问题的原因,也许我应该去其他地方?
您提到的递归策略类似于二进制搜索,并且在遍历树以找到通用值时影响最大,因为假定树是按排序的方式构造的,以实现最大的横向效率。 但是,如果您确实打算通过递归来解决问题,则可以遍历列表本身:
def minimum(l, val):
if not l[1:]:
return val
return minimum(l[1:], l[0] if l[0] < val else val)
l = [34, 23, 2, 4, 18]
print(minimum(l, l[0]))
输出:
2
最后,我相信这只是一个示例,说明如何使用递归而不是使用循环来遍历列表并用于学习目的。 您可以将列表连续地分成两半,直到获得长度为1
的列表,这是在元素浮出水面时的长度。 如果您出于学习目的而执行此操作,建议您添加print()
语句以查看列表的功能。
def minimum(lst):
if len(lst) == 1:
return lst[0]
else:
m1 = minimum(lst[0:len(lst) / 2])
m2 = minimum(lst[len(lst) / 2:])
if m1 < m2:
return m1
else:
return m2
if __name__ == "__main__":
print(minimum([3, 4, 1, 2, 5]))
print(minimum([3, 2, 1, 0]))
但是正如@HFBrowning在评论中提到的那样,在现实生活中,您应该只使用min(lst)
并完成它。
正如@PatrickHaugh在对此答案的评论中提到的那样,该除法必须返回一个integer 。 这意味着,如果您在Python 3上运行此代码,则应将len(lst) / 2
更改为len(lst) // 2
(请参见double /
?)
def RecursiveMin(L):
if len(L)==2:
if L[0]<L[1]:
return L[0]
else:
return L[1]
else:
X= RecursiveMin(L[1:])
if L[0]<X:
return L[0]
else:
return X
此公式将为您提供列表中的最小值。
L=[99,45,78,34,67,2,34,88]
RecursiveMin(L)
>>> 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.