使用递归找到嵌套列表python的最小值max并且没有循环

时间:2017-02-26 01:15:14

标签: python algorithm list recursion

def min_max(L):

    if len(L) == 1:
        res = [L[0], L[0]]

    else:
        res = min_max(L[1:])

        if (L[0] < res[0]):
            res[0] = L[0]

        if (L[0] > res[1]):
            res[1] = L[0]

    return res

这是我的常规列表代码。如果只有一个元素,那么该元素都是最小值和最大值。否则,我们会在其前面的列表中找到元素的最小值和最大值,然后我们进行比较,然后交换更大或更小。

我应该为嵌套列表执行此操作。我尝试做的是在if len(L) == 1案例之前添加这行代码。

if isinstance(L[0],list):
    res = min_max(L[0])

elif len(L) == 1:
    res = [L[0], L[0]]

这部分有效,但在min_max([[3,2],4])等示例中,如果不考虑4,则返回[2,3]。如何解决此问题?

2 个答案:

答案 0 :(得分:2)

以下适用于我:

def min_max(L):
    length = len(L)
    if length == 1:
        if isinstance(L[0],list): // sole element is a list, return its min & max
            return min_max(L[0])
        else:
            return [L[0], L[0]]   // otherwise it is both the min & max
    else:
        mid = length // 2
        result = min_max(L[:mid])  // find min and max of first half of list
        result2 = min_max(L[mid:]) // ditto for second half of list
        // now determine which of the two sets are the min and max of current list
        if (result2[0] < result[0]):
            result[0] = result2[0]
        if (result2[1] > result[1]):
            result[1] = result2[1]
        return result

请注意,这会将列表每次减少一半,而不是一次减少一个元素。您仍然最终检查每个元素,但堆栈上的调用数量与列表长度的日志成比例增长,因此该版本几乎可用于您可以创建的任何列表列表,其中您的列表仅适用于列表少于1000个元素。

如果您担心可能的空列表或子列表:

def min_max(L):
    length = len(L)
    if length > 1:
        mid = length // 2
        result = min_max(L[:mid])
        result2 = min_max(L[mid:])
        if (result2[0] < result[0]):
            result[0] = result2[0]
        if (result2[1] > result[1]):
            result[1] = result2[1]
        return result
    elif length == 1:
        if isinstance(L[0],list):
            return min_max(L[0])
        else:
            return [L[0], L[0]]
    else:
        return [float('inf'), -float('inf')]

答案 1 :(得分:0)

您可以通过传递当前的最小值和时间来简化您的代码。 max作为额外参数。那么你的代码基本上需要处理三种不同的场景:

  1. 给定列表为空 - &gt;返回最小值最大参数
  2. 列表中的第一个元素是列表 - &gt;使用嵌套列表和min&amp;进行递归最大值,然后用列表的其余部分递归
  3. 列表中的第一个元素是number,update min&amp;最大并递归列表的其余部分
  4. 在实践中,代码看起来像这样:

    def min_max(L, minimum=float('inf'), maximum=-float('inf')):
        # Base case, return accumulated result
        if not L:
            return minimum, maximum
    
        if isinstance(L[0], list):
            # Element is a list, recurse with it
            minimum, maximum = min_max(L[0], minimum, maximum)
        else:
            # Element is a number, update current min & max
            minimum = min(minimum, L[0])
            maximum = max(maximum, L[0])
    
        # Process rest of the elements on the list
        return min_max(L[1:], minimum, maximum)
    
    print(min_max([[3,2],4]))
    

    输出:

    (2, 4)