查找列表中的最小元素(递归) - Python
Posted
技术标签:
【中文标题】查找列表中的最小元素(递归) - Python【英文标题】:Finding minimum element in a list (recursively) - Python 【发布时间】:2018-06-13 13:41:56 【问题描述】:我正在尝试使用递归在整数列表中找到最小值。主要思想是如果列表只有一个元素长,这个元素是我的最小值。 否则,我将列表分成两个相同大小的较小列表,在两个列表中查找最小值,然后比较哪个更小。 代码如下所示:
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:比较中超出了最大递归深度”。 算法有问题,或者我应该在其他地方寻找这个问题的原因?
【问题讨论】:
不再是:recursion 对于没有 recursive 结构的事物来说是个坏主意。如果您想计算 tree 的最小元素,但不是列表。至于为什么不起作用?因为您在一段时间后使用浮点数,所以使用(l+p)//2
而不是 (l+p)/2
。
什么是l
、a
和p
?不管它们是什么,l == p
可能不适合停止递归。
除非您尝试尝试和学习递归,否则您真的应该使用 min(my_list)
并完成它
【参考方案1】:
您提到的递归策略类似于二进制搜索,并且在遍历树以查找通用值时效果最大,因为假定树以排序方式构造以实现最大的横向效率。但是,如果您真的打算通过递归解决问题,则可以遍历列表本身:
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
【讨论】:
我觉得这种方法叫分而治之【参考方案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 在对此答案的评论中提到的那样,除法必须返回一个整数。这意味着,如果您在 Python 3 上运行它,您应该将 len(lst) / 2
更改为 len(lst) // 2
(参见双精度 /
?)
【讨论】:
【参考方案3】: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
【讨论】:
以上是关于查找列表中的最小元素(递归) - Python的主要内容,如果未能解决你的问题,请参考以下文章