如何用递归实现Python中的“数组求最大值”?
下面是我编写的一个简单的测试代码
我想通过递归来实现
我在学习算法,学习递归。你知道吗
非常感谢!你知道吗
def max(list):
if list == []:
msg = "List: ..."
return msg
max = list[0]
for item in list[1:]:
if item > max:
max = item
return max
data = [8,2,-690,4,12,-320,0, 98]
print(max(data))
Tags:
如果您想使用递归,那么仔细地定义结束情况是非常重要的。你知道吗
很明显,列表中元素的最大值不是第一个元素就是其余元素的最大值:它是两个值中的最大值。这实际上就是您要寻找的递归。你知道吗
但是如果没有第一个元素会发生什么呢?您有一个空列表和一个未定义的行为。为什么不
maximum([]) = 0
?因为这会导致一些不一致:maximum([-1]) = greatest(-1, maximum([])) = greatest(-1, 0) = 0
。(您也可以尝试maximum([]) == -math.inf
,但这不是很直观!)你知道吗如果列表的其余部分是空的呢?没问题,你只有一个元素,它是最大值。你知道吗
只需将此分析转化为代码:
更多关于
maximum([])
我将尝试给
maximum([])
一个值。我重复上面的论点。对于任何给定的n
,maximum([n]) = greatest(n, maximum([])) = n
。这意味着,对于每个n
,maximum([]) <= n
。满足此条件的唯一值是-math.inf
。为什么不定义maximum([]) == -math.inf
?假设您创建了一个minimum
函数。出于对称的原因,您必须定义minimum([]) == math.inf
。因此它存在一个列表l0 = []
,这样minimum(l0) > maximum(l0)
。没有人会接受这种可能性。你知道吗我们现在该怎么办?主要有两种可能性:防御性编程或使用合同。在防御性编程中,函数将检查它接收到的参数,如果其中一个参数不正确,函数将失败。我就是这么做的:
如果你使用契约,你基本上会说:如果你给这个函数一个空列表,那么行为是未定义的。它可能返回任何值,崩溃,循环永远。。。。在这里,你会有这样的东西:
看起来是一样的,但是有很大的不同。您可以使用,作为
maximum([])
的返回值,因为现在很明显,它没有任何意义。一个试图检查minimum(l0) <= maximum(l0)
是否l0 = []
的人显然违反了合同,并且不会对结果感到惊讶。当然,如果你想让它变得健壮,你会写:尝试以下操作(根据OP的请求,使用递归):
没有使用内置函数(例如
max
),因为OP声明它们不希望使用任何内置函数。你知道吗函数
return
的else
部分要么是list
的第一个元素,要么是列表中最大的数字(不包括第一个元素),具体取决于哪个数字较大。你知道吗每次执行
else
部分时,largest(arr[1:])
位检查没有第一个元素的arr
中哪个数字最大。这意味着,在某一点上,arr
将包含两个元素。当它这样做时,一行if
语句用于比较这两个元素,return
是较大的元素。你知道吗最后,代码返回到第一级,
return
是最大的元素。你知道吗我会写
max
和max_all
max_all
可以用任意数量的参数调用或者使用
*
到unpack arguments它甚至可以在0输入时工作
相关问题 更多 >
编程相关推荐