2016-07-23 87 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