2017-09-06 52 views
0

我正在進行離散數學課程。在本課程中,我們的書談到了不同的排序算法。爲了更好地理解這一點,我嘗試將這些算法之一轉換爲python,但是該算法返回一些意外的輸出,並且我沒有意識到我的錯誤在哪裏。如果你願意,請看下面。任何幫助深表感謝。尋找最大回報意想不到的輸出

### Find max ### 
# A = Array of values to find max from. 
# n = Length of array A. Can also be described as the number of loops the array will perform 

A = [100, 3, 7, 15, 17, 19, 25, 31, 32, 8, 21, 5, 51, 64, 63] 
n = len(A) #len: python command to retrieve length of an array. 

def find_max(A, n): 

    max = 0 

    for i in range(0, n): 
     if A[i] > max: 
      max = i 
    return max 

### Input A and N in the algorithm and print the output ### 
print find_max(A, n) 

這裏預期的輸出應爲0,因爲在陣列中的第一個條目具有最高的值。但是腳本返回14,這是數組中最高的鍵。

我想python腳本儘可能類似僞代碼。簡單地說,讓我們的新生比較容易與彼此進行比較。這是從我們的書的僞代碼:

find_max(A, n) 
    max = 0 
    for i = 0 to n-1 
     if (A[i] > A[max]) max = i 
    return max 
+1

'如果A [1]>最大: 最大= A [1]'。將指數與數值混合在一起。 –

+0

你可以使用'for a in a:如果a> max:max = a'來避免玩索引。當然內置'max'函數在所有情況下都是最好的。 –

+0

@ Jean-FrançoisFabre謝謝你的回答。你想介紹一下你的評論嗎?我不確定在這方面指數是指什麼。 – n0rd

回答

1

首先,你不應該使用max作爲變量,因爲它是一個Python關鍵詞,第二,你的變量max(姑且稱之爲mx),持有最大值的索引,而不是本身的價值,所以這裏是你的問題的解決方案:

A = [17, 19, 25, 31, 32, 3, 7, 15, 8, 21, 100, 5, 51, 64, 63] 
n = len(A) 

def find_max(A, n): 

    mx = 0 # we call it mx 

    for i in range(1, n): # since mx = 0, no need start at 0 
     if A[i] > A[mx]: # we compare the number in A[i] with the number in A[mx] not with mx 
      mx = i 
    return mx # index 

print(find_max(A, n)) # => 10 
+0

我希望函數返回最高數字的索引。不是數字本身。 – n0rd

+1

@ n0rd按照解釋,只需返回'mx'而不是'A [mx]'。 –

+0

接受這個答案,因爲將變量max更改爲mx解決了問題。此外,這個答案在理解問題時很有幫助,同時爲原始代碼提供了準確版本,並且始終專注於具體問題。 – n0rd

2

爲什麼它不工作:你嘗試混合指數&值。

看起來像僞代碼(有,添加了檢查的情況下,該陣列是空的,所以它不返回0):

def find_max(A, n) 
    if not A: 
     raise Exception("empty array") 

    max = 0 
    for i in range(1,n): # no need to start at 0, already covered 
     if A[i] > A[max]: 
      max = i 
    return max 

作爲結論,是有效的最好的方式和Python的可能是使用enumerate進行指數&值和內置max與拉姆達告訴max尋找值:

max(enumerate(A),key=lambda x:x[1])[0] 
+0

我希望代碼儘可能類似書中的僞代碼。簡單地說就是比較兩者更容易。我將發佈上面的僞代碼。 – n0rd

+0

所以去quickfix。 –

+0

quickfix使函數返回最高數字。我想要該函數返回最高數字的索引。不是數字本身。 – n0rd

1

這會完成這項工作:

def find_max(A, n): 

    max = 0 

    for i in range(0, n): 
     if A[i] > max: 
      max = A[i] 
return max 

,或者您可以使用BUIL的MAX功能:

result = max(A) 
+0

這答案不同於/改善已發佈的答案? –

+0

原始海報正在請求最大值的索引,而不是最大值本身。 – Darthfett

+0

我的不好,沒有檢查得很好。但我認爲這個問題已更新 – oumar