2016-11-28 101 views
-1

我目前正在做一個項目,需要我創建一些在模塊中構建的Pythons,而無需藉助任何內置模塊。我的程序創建了一個長度爲500的元素,其隨機數字範圍爲1,999。我的問題出現在我的find_max(數字)函數中。在列表中的第三個元素的循環停止

def find_max(numbers): 
    i = 0 
    stop = 0 
    a = i+1 
    count = 0 
    if numbers[1] > numbers[2]: 
      greatest = numbers[1] 
    elif numbers[2] > numbers[1]: 
      greatest = numbers[2] 
    while count != 500: 
      if greatest > numbers[i]: 
        i += 1 
        count += 1 
      elif numbers[i] > greatest: 
        greatest = numbers[i] 
        i += 1 
        count += 1 
      else: 
        count+=1 
    print("The greatest: "+str(greatest)) 
    mainmenu(numbers) 

當我在排序我的列表之前或之後使用它時,它總是會停在第三個元素上。我find_min(數字)功能是最大的鏡像副本與< intstead的>,總是設法找到之前或排序名單後的最低值。我已經嘗試在範圍(len(list))中使用for count:作爲我的條件爲具有相同結果的循環。

OUTPUT:

請輸入您的菜單選項:最大

最大:10

LIST(後排序):

請輸入您的菜單選項:排序

[1,7,10,11,12,13,13,14,20,29,34,38,38,39,41,44,45,51,55,56,57,57,57,62,63 ,69,72,73,77,78,82,83,83,95,96,98,100,102 ,103,104,105,106,106,111,114,114,115,116,117,123,123,125,126,127,132,134,134,135,136,138,139,140,140 ,142,142,142,146,148,149,151,154,156,158,158,161,163,166,166,168,170,173,173,175,175,176,182,183,184 ,190,197,197,204,204,205,207,207,207,213,216,217,217,219,219,221,221,221,221,222,225,227,230,233,236 ,243,244,249,250,250,250,253,254,256,260,261,262,265,267,268,275,276,277,278,286,290,293,294,297,299,249,244,249,255,268,270,274,268,274,274,274,274,274,274,274,274,274 ,301,302,304,305,307,308,308,309,315,318,319,322,325,332,333,334,337,338,338,341,342,342,343,344,345 ,347,348,352,354,355,355,355,357,357,359,362,363,367,368,370,373,374,374,378,385,387,387,391,391,392號公報,393,399,401,403,409,417,418,419,419,421,421,424,424,428,428,430,431, ,441,446,447,449,450,450,452,454,456,457,457,457,457,459,463,464,467,470,470,471,475,475,476,478,479,以及其中之一或以上。 ,484,489,490,501,503,504,504,507,511,513,513,513,516,516,522,532,533,534,534,537,538,538,540,548,552,以及其中的一個或多個, ,557,557,562,563,563,564,572,573,574,576,577,579,583,583,584,587,588,589,592,592,592,594,595,596,598號公報中所公開的那些, ,601,602,604,605,605,606,606,607,617,617,619,622,622,625,626,627,629,631,634,636,637,642,642,643,643,以及632。 ,653,654,656,658,658,663,669,672,672,673,674,674,679,680,681,682,683,685,692,695,696,696,698,699,709中的任何一個或多個, ,709,710,710,711,717,727,727,735,740,741,743,746,754,754,755,757,764,765,765,768,769,773,773,783,786,及其組合,788,791,792,792,793,798,800,803,803,809,809,809,813,813,813,814,815,815,816,817,817,819,821,822,823,822,823,813,813,813,813,813,813,814,815,815,816,817,817,819,821,822,823, ,824,824,826,827,829,829,830,830,831,831,834,83​​5,839,840,841,841,842,842,842,843,843,843,844,850,853和834。 ,854,863,863,864,868,869,870,875,877,879,880,880,882,884,884,886,887,887,889,893,894,896,896,897,897,以及其它的一些實施例中, ,899,901,903,903,903,905,906,909,910,913,916,916,917,917,919,920,920,921,922,922,923,926,926,926,927,以及其中,所述第一和第二分支,928,931,932,932,935,935,936,937,938,943,949,951,951,953,954,956,958,958,959,960,966,974,974,975,976,973,931,932,932,935, ,978,979,983,984,987,991,993,993,994,995,998,999]

UPDATE:

下面是適用於問題的代碼:

def initial(): 
    numbers = [] 
    i = 0 
    while i <= 499: 
      temp = random.randint(1,999) 
      numbers.append(temp) 
      i += 1 
    return numbers 

def find_min(numbers): 
    i = 0 
    if numbers[1] < numbers[2]: 
      least = numbers[1] 
    elif numbers[2] < numbers[1]: 
      least = numbers[2] 
    for element in range(len(numbers)): 
      if least < numbers[i]: 
        i += 1 
      elif numbers[i] < least: 
        least = numbers[i] 
        i += 1 
    print("The lowest: "+str(least)) 
    mainmenu(numbers) 
+1

對於你的學習,這是完全可以用調試器解決的(https://docs.python.org/2/library/pdb.html)如果你自己找出原因,它會延長。 – Mai

+2

你並不需要索引來解決這個問題。 '數字中的數字:'將迭代每個數字。 –

+0

有幾個問題。使用筆和紙以及測試裝置瀏覽代碼。如果數字[1] ==數字[2],哪個初始值最大呢?如果數字[i] ==最大,你的while循環會發生什麼?我想你會發現你的測試數據對於第一批數字可能具有相同的值。 – Kif

回答

1

我與天氣鬥爭來回答這個問題,並有可能剝奪你計算出它的價值。不過,我認爲看到一種更乾淨的方式來做你正在努力完成的事情也是有價值的。通過查看其他代碼,我學到了很多東西。你決定是否要使用這個或通過你自己的工作。

>>> def find_max(numbers): 
    greatest = numbers[0] 
    for x in numbers: 
     if x > greatest: 
      greatest = x 
    return greatest 

>>> find_max([3,400,200,100,500,250]) 
500 

>>> find_max([250,500,100,200,400,3]) 
500 

請注意,python會自動遍歷數字 - 你不需要管理增量。在這種情況下,這與您在其他語言的for-each循環中看到的內容類似,如果您想查看它。

另請注意,比較邏輯可以更容易。對於這些事情來說,這是一種非常常見的模式,所以它可能值得您使用這種方法。

+0

謝謝,這是一個非常有用的解決方案。當我開始工作時,我正忙於完成這項任務,即使對我自己而言,我的邏輯也很難遵循,所以這非常有幫助。我主要是問我的程序在哪裏失敗,因爲我無法理解爲什麼這段時間甚至是我使用的循環失敗。 –

1

您沒有增加您的清單索引,i。我發現這個問題有一個簡單的打印

while count != len(numbers): 
     print (count, i, numbers[i], greatest) 
     if greatest > numbers[i]: 

這顯示了困難,調用:

test = [3, 1, 4, 1, 5, 9] 
find_max(test) 

輸出:

0 0 3 4 
1 1 1 4 
2 2 4 4 
3 2 4 4 
4 2 4 4 
5 2 4 4 
The greatest: 4 

首先,您的最終其他子句不會增加i。您不需要兩個並行運行的計數器:使用計數i,而不是兩者。

第二,因爲你事先知道你走了多少次循環時,使用循環,而不是一個

for i in range(len(numbers)): 

更妙的是,因爲你並不真正需要要知道哪裏最大因素是在列表中,只是遍歷列表(我看到馬克Tolonen也創下這個在評論):

for element in numbers: 

最後,如果語句使得這個更改不會更新中的更新計數器,那麼您就沒有所有這些令人討厭的冗餘代碼。

相關問題