简体   繁体   English

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

[英]Finding minimum element in a list (recursively) - Python

I'm trying to find the minimum value in a list of integers using recursion. 我正在尝试使用递归在整数列表中找到最小值。 The main idea is that if the list is only one element long, this element is my minimum. 主要思想是,如果列表只有一个元素长,则此元素是我的最小值。 Else, I divide the list onto two smaller lists of the same size, look for minimum value in both of them and then compare which one is smaller. 否则,我将列表分成两个相同大小的较小列表,在两个列表中寻找最小值,然后比较哪个较小。 The code looks like this: 代码如下:

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

It doesn't seem to be difficult, however when I tried to run this function for a sample list, I got the following error: " RecursionError: maximum recursion depth exceeded in comparison ". 似乎并不困难,但是当我尝试为示例列表运行此功能时,出现以下错误:“ RecursionError:在比较中超出了最大递归深度 ”。 Is something wrong with the algorithm or maybe I should look somewhere else for the reason fo this problem? 算法有问题吗,或者出于这个问题的原因,也许我应该去其他地方?

Your recursive strategy mentioned is similar a binary search, and it is most effected when traversing a tree to find a generic value as the tree is assumed to be structured in a sorted manner for maximum transversal efficiency. 您提到的递归策略类似于二进制搜索,并且在遍历树以找到通用值时影响最大,因为假定树是按排序的方式构造的,以实现最大的横向效率。 If you are truly intent on solving the problem with recursion, however, you can iterate over the list itself: 但是,如果您确实打算通过递归来解决问题,则可以遍历列表本身:

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]))

Output: 输出:

2

In the end, I believe this is just an example on how to iterate through a list using recursion rather than using a loop and used for learning purposes. 最后,我相信这只是一个示例,说明如何使用递归而不是使用循环来遍历列表并用于学习目的。 You can continuously split the list into halves until you get a list of length 1 , which is when you surface the element. 您可以将列表连续地分成两半,直到获得长度为1的列表,这是在元素浮出水面时的长度。 If you're doing this for learning purposes, I suggest you add print() statements to see what your list is doing. 如果您出于学习目的而执行此操作,建议您添加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]))

But as @HFBrowning mentioned in a comment, in real life you should just use min(lst) and be done with it. 但是正如@HFBrowning在评论中提到的那样,在现实生活中,您应该只使用min(lst)并完成它。

And as @PatrickHaugh mentioned in a comment to this answer, the division must return an integer . 正如@PatrickHaugh在对此答案的评论中提到的那样,该除法必须返回一个integer Which means, if you're running this on Python 3, you should change the len(lst) / 2 to len(lst) // 2 (see the double / ?) 这意味着,如果您在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

This formula will give you the smallest value in list. 此公式将为您提供列表中的最小值。

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