需要将两个函数合二为一(Python)

com*_*oob -1 python recursion function

这是我的代码-

def Max(lst):
    if len(lst) == 1:
        return lst[0]
    else:
        m = Max(lst[1:])
        if m > lst[0]: 
            return m
        else:
            return lst[0]
def Min(lst):
    if len(lst) == 1:
        return lst[0]
    else:
        m = Min(lst[1:])
        if m < lst[0]: 
            return m
        else:
            return lst[0]
print("Max number:",Max([5,4,100,0,2]))
print("Min number:",Min([5,4,100,0,2]))
Run Code Online (Sandbox Code Playgroud)

基本上我需要一个返回最大和最小数字的函数,它需要递归。我将如何更改此代码?

das*_*s-g 5

在列表输入上运行的某些类型的递归算法/实现是 非常很容易想出,如果你知道“技巧”。那个技巧是:

假设你已经有了一个可以做你想做的事情的函数。

等等,不,这真的没有意义,是吗?那么我们就已经完成了。

让我们再试一次:

假设您已经有一个可以做您想做的事情的函数(但适用于比您需要的小 1 个元素的输入)

在那里,好多了。虽然有点傻,但这是我们可以使用的假设。

那么,我们想要的吗?在您的示例中,它返回列表的最小和最大元素。假设我们希望它们作为 2 元组(又名“对”)返回:

lst = [5, 4, 100, 0, 2]

# Well, actually, we can only do this for a smaller list,
# as per our assumption above.
lst = lst[1:]

lst_min, lst_max = magic_min_max(lst)  # I want a pony!

assert lst_min == 0   # Wishful thinking
assert lst_max == 100 # Wishful thinking
Run Code Online (Sandbox Code Playgroud)

如果我们有这样一个神奇的函数,我们可以用它来解决实际输入大小的问题吗?咱们试试吧:

def real_min_max(lst):
    candidate = lst[0]
    rest_of_the_list = lst[1:]
    min_of_rest, max_of_rest = magic_min_max(rest_of_the_list) # Allowed because
                                                               # smaller than lst
    min_of_lst = candidate if candidate < min_of_rest else min_of_rest
    max_of_lst = candidate if candidate > max_of_rest else max_of_rest
    return min_of_lst, max_of_lst
Run Code Online (Sandbox Code Playgroud)

不是很容易,但很直接,不是吗?但是让我们假设我们的魔法函数magic_min_max有一个额外的限制:它不能处理空列表。(毕竟,空单不具有既不是最小的,也不是最大的因素。甚至没有魔法可以改变这种状况。)

所以如果lst有大小 1,我们不能调用魔法函数。不过对我们来说没问题。这种情况很容易被发现,也很容易规避。单个元素既是其列表的最小值又是最大值,所以我们只返回它两次:

def real_min_max(lst):
    candidate = lst[0]
    if len(lst) == 1:
        return candidate, candidate  # single element is both min & max
    rest_of_the_list = lst[1:]
    min_of_rest, max_of_rest = magic_min_max(rest_of_the_list) # Allowed because
                                                               # smaller than lst
                                                               # but (if we get
                                                               # here) not empty
    min_of_lst = candidate if candidate < min_of_rest else min_of_rest
    max_of_lst = candidate if candidate > max_of_rest else max_of_rest
    return min_of_lst, max_of_lst
Run Code Online (Sandbox Code Playgroud)

所以就是这样。

但是等等......没有魔法。如果我们想调用一个函数,它必须实际存在。所以我们需要实现一个可以返回列表的最小值和最大值的函数,这样我们就可以在real_min_max而不是magic_min_max. 由于这是关于递归的,您知道解决方案:real_min_max 该函数(一旦通过调用确实存在的函数来修复它),我们就可以让它调用自身:

def real_min_max(lst):
    candidate = lst[0]
    if len(lst) == 1:
        return candidate, candidate  # single element is both min & max
    rest_of_the_list = lst[1:]
    min_of_rest, max_of_rest = real_min_max(rest_of_the_list) # No magic needed,
                                                              # just recursion!
    min_of_lst = candidate if candidate < min_of_rest else min_of_rest
    max_of_lst = candidate if candidate > max_of_rest else max_of_rest
    return min_of_lst, max_of_lst
Run Code Online (Sandbox Code Playgroud)

让我们试试看:

lst = [5, 4, 100, 0, 2]
real_min_max(lst)  # returns (0, 100)
Run Code Online (Sandbox Code Playgroud)

有用!