仅使用递归返回列表中的第二个最小项

时间:2018-07-04 21:29:19

标签: python list recursion

在这种更高级的方案中遇到了麻烦。

我理解这一点:

def max(alist):
    if len(alist) == 1:
        return alist[0]
    else:
        m = max(alist[1:])
        return m if m > alist[0] else alist[0]

仅使用递归就可以在列表中找到最大数目。每次重复此功能时,都会慢慢缩小列表。我的问题是我需要创建一个返回第二个最小数字的函数。我不知道如何执行此操作,因为您需要将每个项目与列表中的其余项目进行比较。我该如何仅使用递归而没有内置函数或for循环呢?

1 个答案:

答案 0 :(得分:0)

我会先sort itmerge sort),然后再考虑第二个元素,得出时间复杂度O(nlog(n))

def second_max(lst):
    #takes two sorted lists and merges them together
    def merge(a,b):
        if len(a) == 0: return b
        if a[0] < b[0]:
            return [a[0]] + merge(a[1:],b)
        else:
            return [b[0]] + merge(b[1:],a)
    #breaks list down and then merges back up - sorting
    def merge_sort(lst):
        if len(lst) == 1: return lst
        h = int(len(lst)/2)
        return merge(merge_sort(lst[:h]), merge_sort(lst[h:]))
    #return second element from sorted list
    return merge_sort(lst)[1]

和测试:

>>> second_max([9, 3, 9, 6, 2, 4])
3