2014-04-17 20 views
0

我試圖寫一個遞歸函數,獲取作爲輸入字符串和字符。該函數返回字符串中char的第一個索引外觀。如果char不出現,則返回None。 我只有在返回None時纔有問題。在我的情況下,當字符串不是在字符串函數拋出一個錯誤,任何建議?在字符串遞歸中的第一個索引外觀

def char_first_index(s,c): 
    if len_rec(s)==0: 
     return None 
    if s[0]==c: 
     return 0 
    return 1+ char_first_index(s[1:],c) 
+0

這誤差是......?另外,什麼是'len_rec'? –

+0

TypeError:不支持的操作數類型爲+:'int'和'NoneType' – user2751595

+1

這是因爲只有在最後一次調用時,空字符串上的那個調用返回'None'。但所有以前的調用返回1 +的東西。這導致了諸如「1 + 1 + 1 + ... + None」之類的事情。你不能把'None'加到整數上。恐怕需要重新設計功能。如果字符在字符串中,那麼如何返回'-float(「Infinity」)「,所以用戶可以檢查該值是否爲<0或者返回1,並要求用戶檢查結果是否更大比字符串的長度。總是返回相同類型的對象通常是一個好主意。 – Cu3PO42

回答

1

如果字符不在輸入,你的函數試圖執行1+None,因此錯誤。試試這個:

def char_first_index(s,c): 
    if len_rec(s)==0: 
     return None 
    if s[0]==c: 
     return 0 
    answer = char_first_index(s[1:],c) 
    if answer is not None: 
     return 1+answer 
    else: 
     return answer 
+0

它完成了工作,但對我來說感覺相當不好。 – Cu3PO42

3

您正在每次迭代創建一個新的片,並且您必須爲每個遞歸添加1。相反,遞歸的指數:

def char_first_index(s, c, index = 0): 
    if len(s) == index: 
     return None 
    if s[index] == c: 
     return index 
    return char_first_index(s, c, index + 1) 
1

首先我假設len_rec是一個遞歸函數獲取字符串的長度;你沒有寫出來,所以我只是將它改爲len()進行測試。

其次,我不知道這個函數應該如何處理不在字符串中的字符,因爲這將意味着嘗試將None添加到數字中。

這裏是仍然使用您的計理念的修正功能,但處理一個None的情況下返回:

def char_first_index(s,c): 
    if len(s)==0: 
     return None 
    elif s[0]==c: 
     return 0 
    else: 
     count = char_first_index(s[1:], c) 
     if count != None: 
      return count + 1 
     else: 
      return None 
相關問題