2016-07-23 40 views
-1

我試着寫一個遞歸功能,說如果一個字符串是迴文,但我得到的是一個無限循環,我不知道是什麼問題迴文的遞歸函數

def isPalindrome(S): 
    listush=list(S) #listush=['a', 'b', 'n', 'n', 'b', 'a'] 
    length=len(listush) #length=6 
    if length==0 or length==1: 
     return S, "is a palindrome!" 
    elif listush[0]!=listush[-1]: 
     return S, "is not a palindrome!" 
    else: 
     del listush[0] 
     del listush[-1] 
     return isPalindrome(S) 

print isPalindrome("abnnba") 
+1

'del listush [0]'和'listush [-1]'不會從'S'中刪除字符,該列表與'S'無關。您將原始字符串傳遞給遞歸而不刪除前後字符。 – dhke

回答

0

有一些事情我想談談你的代碼

  • 您可以發送一個列表的一部分,爲您節省刪除 元素的麻煩。
  • 您不需要將其轉換爲列表,您需要 查找回文的所有操作都由字符串支持。
  • 您在遞歸函數中返回S,這將是一個空列表(或字符串) ,因爲它會減少每個遞歸。在 遞歸的情況下,我建議你剛剛返回TrueFalse

下面是一個例子。

def isPalindrome(S): 
    length=len(S) 
    if length < 2: 
     return True 
    elif S[0] != S[-1]: 
     return False 
    else: 
     return isPalindrome(S[1:length - 1]) 

就這麼簡單。

1

第一所有,正確縮進您的代碼。

其次,你用相同的參數再次調用函數。用你正在刪除的'listush'列表呼叫,或從'S'中刪除並用S參數遞歸。

0

如果你做一個print(listush)你可以看到,你的列表永遠不會改變。 代碼的以下修改作品:

def isPalindrome(testStr, orig=None): 
    if orig is None: 
     orig = testStr 
    length = len(testStr) #length=6 
    print(testStr) 
    if length == 0 or length == 1: 
     return orig, "is a palindrome!" 
    elif testStr[0] != testStr[-1]: 
     return orig, "is not a palindrome!" 
    else: 
     return isPalindrome(testStr[1:-1], orig) 

print isPalindrome("abnnba") 
1

沒有必要創建一個列表。一個python字符串已經是一個可索引的序列。

更妙的是,我們可以使用切片,讓函數返回TrueFalse而不是用文本的元組,有了這一切,isPalindrome()變成一個班輪:

def isPalindrome(S): 
    return len(S) < 2 or (S[0] == S[-1] and isPalindrome(S[1:-2])) 

print isPalindrome('A') 
>>> True 
print isPalindrome('AA') 
>>> True 
print isPalindrome('BAAB') 
>>> True 
print isPalindrome('ABAB') 
>>> False