使用递归从元组返回一个项目

时间:2018-03-09 20:20:05

标签: python recursion

def minmaxsum(lst):
    if len(lst) == 1:
        return lst[0], lst[0], lst[0]+lst[0]
    else:
        min_val, max_val, total = minmaxsum(lst[1:])
        if lst[0] < min_val:
            min_val = lst[0]
        if lst[0] > max_val:
            max_val = lst[0]
        total = min_val+max_val
        return min_val, max_val, total

上面我的函数返回列表的最小值,最大值和最小值和最大值之和。

我想知道如何改变功能只返回总数,而不是最小值或最大值。

例如,对于a = [1,2,3,4,5,6]sum(a)将返回7.

3 个答案:

答案 0 :(得分:1)

只需将这些值作为参数传递,并仅返回总数,例如:

In [3]: def minmaxsum(lst, _min=float('inf'), _max=float('-inf')):
   ...:     if not lst:
   ...:         return _min + _max
   ...:     else:
   ...:         head, *rest = lst
   ...:         return minmaxsum(rest, min(_min, head), max(_max, head))
   ...:

In [4]: minmaxsum([1,2,3,4,5,6])
Out[4]: 7

如果您想让minmaxsum签名仅接受列表,请使用辅助函数:

In [8]: def _minmaxsum_helper(lst, _min=float('inf'), _max=float('-inf')):
   ...:     if not lst:
   ...:         return _min + _max
   ...:     else:
   ...:         head, *rest = lst
   ...:         _min = min(_min, head)
   ...:         _max = max(_max, head)
   ...:         return _minmaxsum_helper(rest, _min, _max)
   ...:

In [9]: def minmaxsum(lst):
   ...:     return _minmaxsum_helper(lst)
   ...:

In [10]: minmaxsum([1,2,3,4,5,6])
Out[10]: 7

答案 1 :(得分:1)

如果试图避免使用内置的ins并且肯定尝试递归地执行它,我个人会做这样的事情,这与你原来的逻辑一致:

def min_max_sum(in_list, min=None, max=None):
    if len(in_list) == 0:
        return min+max
    if min is None and max is None:
        min = in_list[0]
        max = in_list[0]
    if in_list[0] < min:
        min = in_list[0]
    if in_list[0] > max:
        max = in_list[0]
    return min_max_sum(in_list[1:], min=min, max=max)

答案 2 :(得分:0)

你的函数的逻辑是合理的,你只需要在调用函数时处理基本情况,这样你就可以返回总数而不是(min, max, total)的元组。这可以通过使用辅助函数或通过使用可选参数来实现。

下面,我已经实现了一个可选参数(mm)的使用,该参数指示是否返回(min, max)元组(没有总计)。因此,默认情况下,这是False,但在递归调用函数时,我们将其设置为True

def sum_min_max(lst, mm=False):
    if len(lst) == 1:
        if mm:
            return lst[0], lst[0]
        else:
            return lst[0] + lst[0]
    else:
        min_val, max_val = sum_min_max(lst[1:], True)
        if lst[0] < min_val:
            min_val = lst[0]
        if lst[0] > max_val:
            max_val = lst[0]
        if mm:
            return min_val, max_val
        else:
            return min_val + max_val

和一些测试:

>>> sum_min_max([1, 2, 3, 4, 5, 6])
7
>>> sum_min_max([5, 2, 1, 3, 4, 2])
6

虽然我个人会使用上面的内容,但这里是帮助功能解决方案,可以达到同样的效果(更多行):

def _min_max_rec(l):
    if len(l) == 1:
        return l[0], l[0]
    else:
        min_val, max_val = _min_max_rec(l[1:])
        if l[0] < min_val:
            min_val = l[0]
        if l[0] > max_val:
            max_val = l[0]
        return min_val, max_val

def sum_min_max(lst):        
    r = _min_max_rec(lst)
    return r[0] + r[1]