在这种更高级的方案中遇到了麻烦。
我理解这一点:
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循环呢?
答案 0 :(得分:0)
我会先sort it(merge 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