繁体   English   中英

在列表中查找最小元素(递归)-Python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM