2017-10-10 49 views
-1

我試着寫一個峯值搜索功能,搜索1D列表中的峯值。我在JavaScript中編寫了相同的算法,並且在給予我的Python算法的相同輸入時工作正常。然而,我的Python算法給了我list index out of range error.下面是我的算法的代碼在Python:峯值搜索功能崩潰

def peak_finder(arr): 
    mid = len(arr)/2 

    if arr[mid] < arr[mid - 1]: 
    return peak_finder(arr[:mid]) 
    elif arr[mid] < arr[mid + 1]: 
    return peak_finder(arr[mid:]) 
    else: 
    return arr[mid] 

我用來測試它的樣本輸入爲:print(peak_finder([0, 1, 6, 5, 4, 3, 2]))

+0

在這行做你的錯誤? – ifconfig

+2

'mid = 7/2'應該是python中的'mid = 7 // 2',否則就是'3.5',其索引將超出範圍。 – kaza

+1

'mid + 1'是長度爲2('mid == len(arr)/ 2 == 2/2 == 1',所以是'mid + 1 == 2')的列表的無效索引。 – chepner

回答

2

您必須添加一些長度檢查:

def peak_finder(arr): 
    if (len(arr) == 1): 
    return arr[mid] 
    elif (len(arr) == 2): 
    return max(arr[0], arr[1]) 

    mid = len(arr)/2 

    if arr[mid] < arr[mid - 1]: 
    return peak_finder(arr[:mid]) 
    elif arr[mid] < arr[mid + 1]: 
    return peak_finder(arr[mid:]) 
    else: 
    return arr[mid] 
+0

@Daniel Trugman,+1 :) – mnv

1

不要忘記檢查數組長度

def peak_finder(arr): 
    if len(arr) == 1: # check 
    return arr[0] 
    if len(arr) == 2: 
    return max(arr[0], arr[1]) 

    mid = len(arr)/2 

    if arr[mid] < arr[mid - 1]: 
    return peak_finder(arr[:mid]) 
    elif arr[mid] < arr[mid + 1]: 
    return peak_finder(arr[mid:]) 
    else: 
    return arr[mid] 
+0

感謝您的迴應!但是,這仍然給我同樣的錯誤。 –

+0

提醒我自己的解決方案:) –