某些类型的列表输入操作递归算法/实现都非常很容易拿出,如果你知道的“猫腻”。这招是:
只是假设你已经有一个功能,可以做你想做的。
等待,不,不没有真正意义,不是吗?那么我们已经完成了。
我们认为再次尝试:
只是假设你已经有一个可以做你想做(但仅为投入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(l) # I want a pony!
assert lst_min == 0 # Wishful thinking
assert lst_max == 100 # Wishful thinking
如果我们有这样一个神奇的功能,我们可以用它来解决问题的实际输入尺寸是多少?让我们试试:
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
不是很容易,但很直截了当,不是吗? 但让我们假设我们的神奇功能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
所以就是这样。
但是等等... 没有魔法。如果我们想调用一个函数,它必须实际存在。所以我们需要实现一个可以返回列表的最小值和最大值的函数,所以我们可以在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
让我们试一下:
lst = [5, 4, 100, 0, 2]
real_min_max(lst) # returns (0, 100)
它的工作原理!
你尝试过什么吗?一个有两个最小值和最大值参数的常规循环会执行这个技巧 –
StackOverflow不是一个代码编写论坛。你试过什么了?请展示你的工作。 – Soviut
你可以写一个返回'Max(lst),Min(lst)'的函数。这将是低效率的,因为它会递归两次,但它是结合两个现有函数的最简单方法。 – BrenBarn