由于最大值实际上肯定包含在A中,因此程序清单1-2中正确的largest()函数先选择A的第1个值作为my_max,再对其他值进行检查,查找是否有其他值比它更大。

程序清单1-2 在列表中查找最大值的正确函数

def largest(A):
  my_max = A[0]                   ❶
  for idx in range(1, len(A)):    ❷
    if my_max < A[idx]:
      my_max = A[idx]             ❸
  return my_max

❶ 把my_max设置为A中位于索引位置0的第1个值。

idx1len(A)(不包括后者)的整数。

❸ 如果A[idx]的值更大,就更新my_max

蝎子.tif如果对空列表调用largest()max(),将会触发一个异常“ValueError:List index out of range exception”。这类运行时异常是程序员所犯的错误,说明他们没有理解largest()所操作的列表至少要包含一个值。

既然我们已经拥有了这个算法的一种正确的Python实现,能不能确定这个新算法调用小于操作的次数呢?能!就是N−1次。我们修正了算法的缺陷,并提高了它的性能(当然,只是提高了微不足道的一点)。

为什么对小于操作的使用进行计数很重要呢?因为它是对两个值进行比较时所使用的关键操作。其他所有程序语句(例如forwhile循环)在不同的实现中可以根据实际所使用的编程语言任意选择。我们将在第2章对这个思路进行扩展,目前只要对关键操作进行计数就足够了。