P106: Find out whether a list is a palindrome
判断列表是不是回文,回文指的是左右对称。用单元测试描述为:
from python99.lists.p106 import is_palindrome
def test_is_palindrome():
assert is_palindrome([]) == True
assert is_palindrome([1]) == True
assert is_palindrome([1,2,3,4,3,2,1]) == True
assert is_palindrome([1,2,3,4,4,3,2,1]) == True
assert is_palindrome([1,2,3,2,2]) == False
这个问题有点难搞。但,
没有什么问题是用递归解决不了的!
当一个列表的头尾两个元素相等且去掉头尾后剩余列表是回文「palindrome」时,这个列表即是回文。反之,则其不是回文。解决方法就是:
- 比较列表的头尾元素是否相同
- 如果头尾元素不相同,则直接判定列表不是回文
- 如果头尾元素相同,则在去除头尾元素的剩余列中上套用1至3,直至剩余列表为空或仅有一个元素
举个例子,给定列表[ 1, 2, 3, 2, 1]
。
- 比较头尾元素
1
和1
,发现其是相等的 - 继续比较剩余列表的头尾元素
2
和2
,发现其也是相等的 - 剩余列表中仅含一个元素,其是回文列表
代码实现:
## Find out whether a list is a palindrome.
## A palindrome can be read forward or backward
def is_palindrome(list):
if list is None:
return False
if len(list) == 0:
return True
if len(list) == 1:
return True
start_index = 0
end_index = len(list)-1
## slicing range is (inclusive, exclusive)
return list[start_index] == list[end_index] and is_palindrome(list[start_index+1:end_index])