2017-06-14 119 views
4

我試圖遞歸地在列表中找到最小值。因爲我還是新的適應遞歸方法,我想尋求關於我行代碼一些幫助:遞歸地在列表中尋找最小值

listA = [9,-2,6,1,80,9,-2] 

def findMinimum(l): 
    if len(l) == 1: 
     return l 

    else: 
     minNumber = findMinimum(l-1) 
     min = listA[0] 
     for i in listA: 
      if listA[i]<listA[i+1]: 
      min = listA[i] 
      return min 

findMinimum(listA) 

,我會很感激,如果有人可以幫助我,因爲我是比較新的遞歸和我的理解絕對符合標準。

+0

'minNumber = findMinimum(l-1)'你是什麼意思?你不能從列表中減去一個整數。你的意思是'minNumber = findMinimum(l [: - 1])' –

+0

@ Ev.Kounis對不起,這是我第一次嘗試自己嘗試遞歸函數。請原諒我對遞歸的理解。謝謝你的建議。現在有道理 – Maxxx

回答

2

你的代碼的結構是正確的,但它有一些錯誤。首先,你不應該在你的函數中使用listA; listA作爲參數從外部傳遞,並且從函數內您應該只指l。在非遞歸的情況下(其中len(l) == 1),您應該返回l[0](帶有一個元素的列表中的最小值是該元素)。然後,在你的函數中再次調用findMinimum是正確的(這是遞歸調用,如你所知);但是,您可能需要的是使用除第一個元素(即l[1:])之外的所有列表l調用它。然後,您應該將結果minNumberl的第一個元素進行比較;這個想法是,你選擇最小的l[0]和最小的l[1:]。然後你返回你選擇的那個。

此外,你可能想要考慮的情況,當你得到一個空列表並拋出一個錯誤;如果你不這樣做,你可能會陷入無限遞歸!

因此,一個可能的解決辦法是這樣的:

listA = [9,-2,6,1,80,9,-2] 

def findMinimum(l): 
    if len(l) == 0: 
     raise ValueError('Cannot find the minimum of an empty list.') 
    elif len(l) == 1: 
     return l[0] 
    else: 
     minNumber = findMinimum(l[1:]) 
     min = l[0] 
     if minNumber < min: 
      min = minNumber 
     return min 

findMinimum(listA) 
+0

謝謝! else語句特別有用 – Maxxx

3

你的函數的第一部分是正確的。但是你應該像這樣改變第二部分:

listA = [9,-2,6,1,80,9,-2] 

def findMinimum(l): 
    if len(l) == 1: 
     return l[0] 

    else: 
     return min(l[0], findMinimum(l[1:])) 

findMinimum(listA) 

請記住,遞歸函數是爲了使我們的代碼更簡單,更簡單。