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. 比较列表的头尾元素是否相同
  2. 如果头尾元素不相同,则直接判定列表不是回文
  3. 如果头尾元素相同,则在去除头尾元素的剩余列中上套用1至3,直至剩余列表为空或仅有一个元素

举个例子,给定列表[ 1, 2, 3, 2, 1]

  1. 比较头尾元素11,发现其是相等的
  2. 继续比较剩余列表的头尾元素22,发现其也是相等的
  3. 剩余列表中仅含一个元素,其是回文列表

代码实现:

## 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])

results matching ""

    No results matching ""