递归检查列表是否是python中的回文

时间:2015-05-20 04:21:20

标签: python recursion

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

到目前为止,我有:

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,我认为基本情况是正确的,但是我的逻辑对于递归调用是有缺陷的。关于如何解决这个问题的任何帮助?

3 个答案:

答案 0 :(得分:2)

你可以像这样在python中使用slice。

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 :(得分: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

答案 2 :(得分: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