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.
答案 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]