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