官术网_书友最值得收藏!

觀察程序清單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是空列表[],它就會返回這個值。現在,讓我們修正這個缺陷。

圖標1Python語句range(x, y)可以產生xy(包括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]

主站蜘蛛池模板: 利川市| 饶阳县| 拉萨市| 鹿邑县| 凭祥市| 南投县| 兴安县| 青海省| 隆安县| 武城县| 登封市| 兖州市| 和静县| 武胜县| 平度市| 抚宁县| 增城市| 马关县| 河东区| 鲁甸县| 平安县| 兴城市| 崇信县| 元江| 衡东县| 北宁市| 尼勒克县| 彰化县| 马山县| 大同市| 牙克石市| 蕲春县| 洪江市| 达孜县| 平昌县| 桃源县| 辽源市| 平南县| 锡林郭勒盟| 黄山市| 阿城市|