首页 > 解决方案 > python minmax 仅使用递归

问题描述

我正在尝试构建一个函数,该函数接受一个列表并返回一个 (min, max) 的元组。

例如,

[2,1,4,9,4.5]

会回来

(1, 9)

我正在尝试仅使用递归并希望执行此任务而不使用其他使这变得非常容易的东西(例如 min()、max()、sort()、sorted()、loop..等)

到目前为止,我已经能够创建找到最大值的函数

def findmax(alist):
  if len(alist) <= 1:
    return tuple(alist)
  elif len(alist) == 2:
    if alist[0] >= alist[1]:
        return findmax([alist[0]])
    elif alist[0] <= alist[1]:
        return findmax([alist[1]])
  elif len(alist) > 2:
    if alist[0] >= alist[1]:
        return findmax([alist[0]] + alist[2:])
    elif alist[0] <= alist[1]:
        return findmax(alist[1:])

哪个

findmax([2,1,4,9,4.5])

返回

(9,)

和一个找到最小值的函数(差别不大)

def findmin(alist):
  if len(alist) <= 1:
    return tuple(alist)
  elif len(alist) == 2:
    if alist[0] >= alist[1]:
        return findmin([alist[1]])
    elif alist[0] <= alist[1]:
        return findmin([alist[0]])
  elif len(alist) > 2:
    if alist[0] >= alist[1]:
        return findmin(alist[1:])
    elif alist[0] <= alist[1]:
        return findmin([alist[0]] + alist[2:])

哪个

findmin([2,1,4,9,4.5])

返回

(1,)

有没有办法仅使用递归将这两个单独的函数合二为一,以便返回所需的结果

(1, 9)

任何帮助将不胜感激。

标签: pythonrecursionminmax

解决方案


我发现这类问题往往比你想象的要简单。让递归完成工作:

def find_min_max(a_list):

    if a_list:
        head, *tail = a_list

        if tail:
            minimum, maximum = find_min_max(tail)

            return [head, minimum][minimum < head], [head, maximum][maximum > head]

        return head, head

    return a_list

用法

>>> find_min_max([2, 1, 4, 9, 4.5])
(1, 9)
>>> find_min_max('elephant')
('a', 't')
>>> 

此解决方案特定于 Python 3,但可以轻松修改以兼容 Python 2 和 3。


推荐阅读