2016-11-20 54 views
-2
def check(x,num,i): 
    for n in range(len(x)): 
     if x[i] == num: 
      return True 
     else: 
      return(check(x,num,i+1)) 
    return False 
def User(x,num): 
    return(check(x,num,0)) 

用戶出現在列表中的一個元素([2,6,1,9,7,3],5,0) 這應該掉,因爲5把假是不在列表檢查是否使用遞歸

檢查是否在列表中出現的元素遞歸

所以例如:

輸入:從鍵盤列表L讀出,例如L = [2,6,1,9,7,3 ] 元素e,例如e = 9

但出於某種原因,我得到一個錯誤,當數不在列表

+1

這應該不起作用。 'range(len(x) - )'語法無效。 –

+0

請[編輯]你的問題,幷包括錯誤的追蹤,以便我們可以幫助你找到並消除問題! – MSeifert

+0

僅供參考:您可以使用'num in x'來檢查'num'是否包含在列表'x'中。 (不遞歸但肯定更高性能)。 – MSeifert

回答

1

遞歸的美麗(和目的)是你做需要循環:

def check(x, num, i): 
    if not x[i:]: # index past length 
     return False 
    if x[i] == num: 
     return True 
    return(check(x, num, i+1)) 

你也可以沒有索引參數:

def check(x, num): 
    if not x: 
     return False 
    return x[0] == num or check(x[1:], num) 
+0

不起作用 – adam

+0

check([2,6,1,9,7,3],5,0)它應該輸出false,因爲它不在列表中。但是,你得到一個錯誤 – adam

+0

謝謝,但你能解釋什麼「如果不是x [我:]」這檢查? – adam

0

我不完全明白你在做什麼,但這是一個遞歸和迭代的奇怪組合。如果你要使用遞歸,至少對於像這樣的基本遞歸問題來說,這是值得的,以避免迭代。嘗試像這樣

該解決方案將工作得很好,是尾遞歸,因此它將快速和優化地工作。

它的工作方式是檢查索引i是否超出範圍。如果是這樣,那麼它返回False。如果它處於界限內,則檢查x[i]是否等於該數字。如果是,則返回True。如果不是,則返回check,索引增加,因此遞歸有效。

0

首先,您的for循環沒有任何意義。你永遠不會使用那個n,並且永遠不會再次進入循環,因爲你總是在第一次迭代中返回一些東西。之後的for循環的return語句也無法訪問,因此您的代碼可以作爲不失爲

def check(x,num,i): 
    if x[i] == num: 
     return True 
    else: 
     return(check(x,num,i+1)) 

那麼實際的問題是,如果你有5個元素,例如,它不包含該元素搜索列表因爲,你問第六個是什麼,雖然沒有第六個元素,所以錯誤。你必須檢查列表是否包含6個元素。所以你檢查它是否超過5個,如果是的話返回false,如果沒有則返回。 (或者,您也可以在整體功能開始檢查)

def check(x,num,i): 
    if x[i] == num: 
     return True 
    else: 
     if len(num)>i: 
      return False 
     else: 
      return(check(x,num,i+1)) 

你所做的則不過是overcomlicated,遞歸的for循環。你只需增加i並進行比較,直到找到該元素或i大於列表長度。因此,這相當於

def check(x,num): 
    for i in range(len(num)): 
     if x[i]==num: 
      return True 
    return False 

這是非常重要的return False是在for循環,因爲你只退貨,如果沒有找到元素,甚至遍歷整個列表之後。

你也可以避免指數。隨着一個for循環可以直接遍歷元素的列表:

def check(x,num): 
    for elem in num: 
     if elem==num: 
      return True 
    return False 

這使得變量ELEM成爲每一個元素在你列出,此起彼伏。

+0

第二個不起作用 – adam

+0

oops,換了第二個if/else語句。固定。 – PattuX