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)
基本上我需要一个返回最大和最小数字的函数,它需要递归。我将如何更改此代码?
在列表输入上运行的某些类型的递归算法/实现是 非常很容易想出,如果你知道“技巧”。那个技巧是:
假设你已经有了一个可以做你想做的事情的函数。
等等,不,这真的没有意义,是吗?那么我们就已经完成了。
让我们再试一次:
假设您已经有一个可以做您想做的事情的函数(但仅适用于比您需要的小 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)
有用!