2016-04-18 64 views
1

我是Python新手(或者編程)而且正在嘗試學習遞歸。更好的方法來檢查一個句子是否是Python中的迴文

我已經寫了一個遞歸python函數來檢查一個句子(而不是一個單詞)是否是迴文。

def checkPalindrome(sentence): 
    sentence = re.sub('[^\w]', '', sentence.lower()) 
    if len(sentence) == 1: 
     return True 
    elif len(sentence) == 2: 
     return sentence[0] == sentence[1] 
    else: 
     return checkPalindrome(sentence[1:-1]) 

此功能可以正常工作並提供正確的結果。例如:

checkPalindrome('Go hang a salami; I’m a lasagna hog') 
True 

然而,因爲我去掉空格,標點和功能的改變開始的句子的情況下,這一步驟將在每次遞歸調用計算。

有沒有更好的方法來重寫函數以避免這種情況?

+1

您可以定義一個單獨的函數,它只是「傳遞」小寫,無標點符號的字符串。或者,只需開始「句子」作爲正確的值。 –

+2

你的函數不起作用,例如傳入字符串'「randomtextQQdsfdfdfs」'它會返回'True',因爲你正在檢查'QQ'字符所在的最後兩個字符是否相等「palindrome」true – Pythonista

+2

我認爲你的邏輯在這裏是錯誤的......只要兩個中間字母相同(中間有一個可選的字母),它會認爲它是一個迴文... @Pythonista擊敗了我 –

回答

2

我認爲你只是回答了你自己的問題:寫一個函數來減少輸入爲小寫字母,然後調用第二個函數。第二個函數執行迴文檢查和遞歸。

但是,請注意您的函數不起作用:它檢查結束字符的唯一時間是在len(句子)== 2的基本情況下。您需要在遞歸調用之前檢查,太:

else: 
    return sentence[0] == sentence[-1] and 
      checkPalindrome(sentence[1:-1]) 

鑑於此,您還可以結合你的兩個基本情況:

if len(sentence) <= 1: 
    return True 

每@主編Joran的建議。我最近一直生活在太多的編譯器優化中;我的原始不是由Python語言定義保證的;這個更新在一般情況下會更好。

+3

好的答案......但它應該可能是'return s [0] == s [-1]和checkPalindrome(s [1:-1])'至少我的兩分錢,因爲沒有點檢查遞歸回文部分如果s [0]!= s [-1]'(+1) –

+0

謝謝大家的回答。我明白現在需要如何去做。 –

相關問題