【问题标题】:Return 2nd smallest item in list using only recursion仅使用递归返回列表中第二小的项目
【发布时间】:2018-07-04 21:29:19
【问题描述】:

我在这个更高级的场景中遇到了麻烦。

我明白了:

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 循环来做到这一点?

【问题讨论】:

  • 函数名在风格上应该是小写;)哦,你不应该覆盖内置的list函数
  • 我建议不要创建一个处理2nd最大的特殊情况的函数,而是看看找到kth最大的,它可以通过@给你2nd最大987654321@,因为您的解决方案需要递归。
  • 修复了样式错误。我仍然不知道如何启动这个第二小的函数。如果重要的话,我只能输入一个列表。

标签: python list recursion


【解决方案1】:

我会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

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多