2015-05-20 70 views
0

我知道可以在Python中使用的一个漂亮的班轮来确定某些输入字符串是否是回文,但是,我希望能够检查列表是否是回文列表,例如[1,2,2,1]应返回True[1,2,3,4]应返回False。我通过函数list_palindrome三个参数 - 要检查的列表,第一个元素的索引和最后一个元素的索引。递归检查列表是否是Python中的回文列表

到目前为止,我有:

def is_mirror(my_list,i1,i2): 
    if len(my_list) <= 1: 
     return True 
    else: 
     if my_list[i1] == my_list[i2]: 
      return is_mirror(my_list[i1:i2],i1,i2) 

但我得到一个IndexError: list index out of range,我觉得基本情况是正确的,但我的逻辑是有缺陷的递归调用。任何帮助我如何解决这个问题?

+1

我闻功课 – teambob

回答

2

您可以使用切片蟒蛇喜欢这种方式。

def isPalindrome(s): 
    if len(s) <= 1: 
     return True 
    return s[0] == s[-1] and isPalindrome(s[1:-1]) 

测试:

>>> isPalindrome([1, 2, 3, 4]) 
False 
>>> isPalindrome([1, 2, 2, 1]) 
True 
>>> isPalindrome([1, 2, 3, 2, 1]) 
True 

或可避免切片和使用索引。 我以0开头,j以len(s)-1开头。

已编辑。

def isPalindrome(s, i, j): 
    if i == j or j < i: 
     return True 

    return s[i] == s[j] and isPalindrome(s, i + 1, j - 1) 

测试:

>>> isPalindrome([1, 2, 3, 4], 0, 3) 
False 
>>> isPalindrome([1, 2, 2, 1], 0, 3) 
True 
>>> isPalindrome([1, 2, 3, 2, 1], 0, 4) 
True 
+1

我在考虑在第二个变体中使用'tmp'变量的可读性比仅仅说'return s [i] == s [j]和isPalindrome(s,i + 1,j-1)'的可读性要差。 – DTing

+1

我想避免数组切片,只是试图采取一种新的方法,感谢您向我展示如何使用索引值做到这一点! – ASm

0

这是一个递归方法。基本前提是,在每个递归步骤中,检查第一个元素和最后一个元素是否相等。如果是这样,请将它们关闭,然后再次将子列表传递给递归函数。

您将继续深入和深入地考虑您的筹码,并将其列入更小和更小的名单,直到您触及基本情况。

def is_mirror(my_list): 
    if len(my_list) <= 1: 
     return True 
    else: 
     if my_list[0] == my_list[-1]: 
      return is_mirror(my_list[1:-1]) 
     else: 
      return False 
+0

这是一个有点冗长,因为每块用一个return语句结束,你不需要'else'条款。如果你已经死定了'else'子句,至少应该使用'elif'。 – Raniz

+0

是的,但如果我改变了,我会基本上和你的答案一样:) –

0

问题是,您正在收缩列表,但没有更改边界参数。你应该只做其中的一个。

我建议你把边界参数和使用切片,而不是收缩名单:

>>> def is_mirror(lst): 
... if not lst: 
...  return True 
... return lst[0] == lst[-1] and is_mirror(lst[1:-1]) 
... 
>>> is_mirror([1, 2, 3, 4]) 
False 
>>> is_mirror([1, 2, 2, 1]) 
True 
>>> is_mirror([]) 
True 
>>> is_mirror([1]) 
True 
>>> is_mirror([1, 3, 1]) 
True 
+1

你也可以用'if not lst:'替换你的基本情况,以使它更好看。 – Blender