2016-01-29 61 views
0

我對Python完全陌生,因此也是個問題。 我試圖解決一個標準的面試問題,該問題是在數組中找到一個峯值 峯值被定義爲大於其左右鄰居的數字。我試圖找到最大的這樣的高峯。在數組中尋找高峯

這是我的代碼

#!/usr/bin/python3 

def main(): 
    arr = [7, 12, 13, 8, 2, 16, 24, 11, 5, 1] 
    num = find_peak(arr) 
    print(num) 

def find_peak(arr): 
    return find_peak(arr, 0, len(arr)) 

def find_peak(arr, start, stop): 

    mid = (start + stop)/2 

    if(arr[mid] > arr[mid-1] and arr[mid] > arr[mid+1]): 
     return arr[mid] 
    elif (arr[mid] < arr[mid -1]): 
     find_peak(arr, 0, mid-1) 
    elif (arr[mid] < arr[mid+1]): 
     find_peak(arr, mid+1, stop) 

if __name__ == '__main__': 
    main() 

這是我得到

Traceback (most recent call last): 
    File "peak.py", line 23, in <module> 
    main() 
    File "peak.py", line 5, in main 
    num = find_peak(arr) 
TypeError: find_peak() missing 2 required positional arguments: 'start' and 'stop' 

任何幫助表示讚賞

+0

不明白的向下投票。如果每個人都知道所有事情,那麼stackoverflow – Zeus

回答

0

要調用此錯誤:

num = find_peak(arr) 

但是find_peak需要3個參數,因爲錯誤狀態。你只提供一個。

與C++或其他語言不同,不能使用具有不同參數(也稱爲函數重載)的相同名稱的函數。但是,您可以在函數聲明中定義可選參數。

+1

有什麼意義呢那麼有一個find_peak也有一個參數。 – Zeus

4

您已經爲find_peak二元函數的定義,一個有一個參數arr和其他三個參數arrstartstop。第二個覆蓋第一個。

使用兩個用於兩個不同的功能

+0

這是否意味着我不能在Python中執行函數重載 – Zeus

+2

這就是它的意思。 –

+0

一旦你改變了函數定義,你將無法訪問被垃圾回收的原始文件。 – mhlester

0
def main(): 
    arr = [7, 12, 13, 8, 2, 16, 24, 11, 5, 1] 
    num = find_peak(arr) 
    print(num) 

def find_peak(arr): 
    return find_peaks(arr, 0, len(arr)) 

def find_peaks(arr, start, stop): 

    mid = (start + stop)/2 

    if(arr[mid] > arr[mid-1] and arr[mid] > arr[mid+1]): 
     return arr[mid] 
    elif (arr[mid] < arr[mid -1]): 
     find_peaks(arr, 0, mid-1) 
    elif (arr[mid] < arr[mid+1]): 
     find_peaks(arr, mid+1, stop) 

    if __name__ == '__main__': 
     main() 
0

重載不同的名字並不在Python不允許的,我的建議是使用默認值,而不是兩個功能

def find_peak(arr, start = 0, stop = 0): 
    if stop == 0: 
     stop = len(arr) 

    mid = (start + stop)/2 

    if(arr[mid] > arr[mid-1] and arr[mid] > arr[mid+1]): 
     return arr[mid] 
    elif (arr[mid] < arr[mid -1]): 
     find_peak(arr, 0, mid-1) 
    elif (arr[mid] < arr[mid+1]): 
     find_peak(arr, mid+1, stop)