2017-04-23 285 views
1

如何在序列中查找最大值?爲什麼這個錯誤「列表索引超出界限」?

k=[10,7,5,9,2] 
def gr(k): 
    i=0 
    j=1 
    for x in k: 
     if k[i]>k[j]: 
      x=k[i] 
      j+=1 
     else: 
      x=k[j] 
      i+=1 
    print x 

爲什麼把最大的沒有。在列表中的第一個位置是索引超出了界限的錯誤,否則它運行完美。我知道各種其他方法來做到這一點,如max和所有,但我想糾正這一點。

+1

您正在更改循環中間的循環變量'x'的值,這絕不是一個好主意。也給有意義的變量名稱,以便你的意圖變得更清晰。 –

+0

重新創建'max()'? –

+0

NOPE!只是弄清楚它是如何工作的。 –

回答

1

讓我們集中於什麼問:

爲什麼把最大的沒有。在列表中的第一個位置是給出索引超出界限的錯誤,否則它運行完美?

的答案很簡單:

該指數ij是在啓動01。如果列表中的第一個項目最大,則列表j中的每個項目都增加1,導致列表中最後一個項目的索引超出界限。

如果最大的項目是不是第一個j將增加一個最大n-1倍,其中n是列表k的長度,因此,指數走出束縛的錯誤不能「成就」。

這裏不改變使用這樣的功能,而不是max(k)搜索最大的病「邏輯」修復:

def gr(k): 
    i=0 
    j=1 
    for x in k: 
     if j > len(k)-1: 
      x=k[i] 
      break 
     if k[i]>k[j]: 
      x=k[i] 
      j+=1 
     else: 
      x=k[j] 
      i+=1 
    print (x) 

順便說一句:在stackexchange他們爲有這樣的一種樂趣人民創造問題https://codegolf.stackexchange.com

我們處於stackoverflow ...

這裏完整起見:

此功能不能總是找到一個列表

最大值什麼挑戰好奇地發現它返回的情況下,錯誤的價值:)

(如果您喜歡,您可以在下面的評論中爲此挑戰提供「解決方案」)

我下面的評論的請求表明,當以上功能並沒有提供正確的結果:

gr([1, 2, 3, 4, 5]) 
gr([4, 1, 7, 3, 9]) 

給出:

4 
7 

它應該給5 9代替。

增編答:在評論帖子的啓發我已經有點進一步提高最後在提供了改進的功能的版本的意見,所以它現在可以正確地覆蓋了所有可能的情況:

def ki(k): 
    i=0 
    j=1 
    y=k[j-1] 
    for x in k: 
     if i > i + j: 
      y=k[i] 
      break 
     if k[j] > y: 
      y=k[j] 
      i+=2 
     else: 
      x=k[j-1] 
      i+=3 
     i-=1 
     j+=1 
     if j > len(k)-1: 
      break 
    if x < x - j: 
     print(x) 
    else: 
     print(y) 

不要採取上述嚴重,但不要笑!沒有幽默在stackoverflow!

附錄B:現在的解決方案,該解決方案......所有上面的代碼,如果你只是扔掉所有這一切都沒有必要,在那裏爲製造混亂唯一的緣故語句和變量可表示如下:

def ki(k): 
    y=k[0] 
    for x in k[1:]: 
     if x > y: y=x 
    print(y) 

知道了這一點,你認識的實際挑戰:編寫的代碼,不會完全一樣的小片以上,但是汗牛充棟,因爲混亂和難以遵循它實際做盡可能...

+0

Thanx爲解決方案加上嘲諷。我知道MAX,減少和各種其他方式來做到這一點先生smarty。當我們在列表中有連續的系列的時候,我們會使用 –

+0

。 –

+0

已經回答您的挑戰....這裏是解決這一畫質GR(K): I = 0 J = 對於x在k-: 如果j> LEN(k)的-1: X = K [I] 斷裂 如果k [I]> = K [j]的: X = K [I] Y = K [j]的 J + = 1 否則: Y = K [j]的 I + = 1 如果x> y: print x else: print y –

0

如果用1初始化j,for循環將執行n次,n是數組的長度。考慮到第一個元素是最大的,根據你的代碼,j將在每次迭代時遞增。

因此在最後一次迭代中,j將增加n - 1次,現在等於n

由於數組的索引從0開始,索引的有效範圍是從0到n - 1

+0

你能提出解決方案嗎?不要改變方法。我知道使用Reduce函數的其他方法。 –

+0

您的算法實際上並不正確。你能解釋爲什麼你要增加'i'或'j'嗎?要找到最大的數字,您可以簡單地跟蹤迄今爲止最大的數字的指數。例如,你可以用0來初始化這個索引,然後迭代數組,並且每當你發現一個比「迄今最大的索引」中的元素大的元素時,你更新「到目前爲止最大的索引」。在迭代結束時,您只需返回「迄今爲止最大的索引」中的元素。 –

0

以下實施方式避免了索引變量ij。 如果序列爲空或僅包含一個元素,則不需要進行比較。如果n是序列的長度,則比較的數量是n-1。因此,實現在第二個元素處開始循環。

我已將打印功能移到了該功能之外。

k = [10, 7, 5, 9, 2] 

def gr(k): 
    if not k: 
     return None 

    if len(k) == 1: 
     return k[0] 

    result = k[0] 
    for x in k[1:]: 
     if x > result: 
      result = x 

    return result 

print(gr(k)) 

結果:

10 

順便說一句,這重創內置max

+0

'返回K [0]' 「打破」了代碼的不合邏輯,因此並不是真正的解決方案...... – Claudio