1.2 在一個任意的列表中查找最大值
觀察程序清單1-1展示的存在缺陷的Python實現,它試圖在一個至少包含1個值的任意列表中查找最大值。它所采用的方法是把A
中的每個值與my_max
進行比較,如果發現一個更大的值就更新my_max
。
程序清單1-1 在列表中查找最大值的算法的一種存在缺陷的實現
def flawed(A):
my_max = 0 ?
for v in A: ?
if my_max < v:
my_max = v ?
return my_max
? my_max
是保存最大值的變量,在這里my_max
被初始化為0。
? for
循環定義了變量v
,用于對A
中的每個元素進行迭代。對v
的每個值均執行一次if
語句。
? 如果v
更大,就更新my_max
。
這個實現的核心是對兩個數進行比較以確定其中一個值是否小于另一個值的小于操作。在圖1-3中,當v
依次從A
中取連續的值時,我們可以看到my_max
被更新了3次,從而確定了A
中的最大值。flawed()
函數用于確定A
中的最大值,調用了6次小于操作,對每個值各調用1次。在一個規模為N的問題實例中,flawed()
調用N次小于操作。

圖1-3 flawed()
的執行示意
這個實現存在缺陷,因為它假設A
中至少有一個值大于0。計算flawed([–5,–3,–11])
時將返回0,這是不正確的。一種常見的彌補方法是把my_max
初始化為可能出現的最小值,例如my_max =float('-inf')
。這個方法仍然存在缺陷,因為如果A
是空列表[]
,它就會返回這個值。現在,讓我們修正這個缺陷。
Python語句
range(x, y)
可以產生x
~y
(包括x
,但不包括y
)的整數。我們也可以采用range(x,y,–1)
的形式,它將產生從x
向下計數到y
(但不包括y
)的整數。因此,list(range(1,7))
的結果是[1,2,3,4,5,6]
,list(range(5,0,–1))
的結果是[5,4,3,2,1]
。我們可以按照任意的步長進行計數,比如list (range(1,10,2))
采用差值為2
的步長,結果是[1,3,5,7,9]
。
- 精通COBOL:大型機商業編程技術詳解(修訂版)
- Revit 2020中文版從入門到精通
- Spring開發者的Quarkus實戰
- DevOps:企業級CI/CD實戰
- 結構BIM應用教程
- 軟件研發效能提升之美
- Android深度探索(卷1):HAL與驅動開發
- Visual Basic編程寶典(十年典藏版)
- 項目實踐精解:基于EJB 3.0和Web Services的Java應用開發
- 構建移動網站與APP:ionic移動開發入門與實戰 (跨平臺移動開發叢書)
- Spring Boot+Vue 3大型前后端分離項目實戰
- 深入淺出系統虛擬化:原理與實踐
- Java核心技術·卷Ⅰ:基礎知識(原書第10版)
- Arduino與LabVIEW開發實戰
- Unity VR與AR項目開發實戰