您的位置:首页 > 其它

P06 (*) 判断一个列表是否是回文列表

2015-12-18 22:32 246 查看
大维基百科的原话:

A palindrome is a word, phrase, number, or other sequence of >characters which reads the same backward or forward.

回文是一个结构,满足回文结构的事物从前或从后遍历元素得到的结果是相同的。具体事物的元素的单位可能是不同的,如一个单词,字符是其元素;一个词组,元素可能是单词;一篇文章,段落可能是其元素。 如,
'(x a m a x)
是一个回文列表。

回文列表有什么特征呢,

(1)反向之后的列表和原有列表相同

(define palindrome?
(lambda (ls)
(equal? ls (reverse ls))))


(2)对称

从两端分别同时向中间移动,直到两端元素不同,返回
#f
,否则
#t


(define palindrome?
(lambda (ls)
(let* ([len (length ls)]
[h 0]
[t (- len 1)])
(let f ([h h] [t t])
(cond
[(< (- t h) 1) #t]
[(eqv? (list-ref ls h) (list-ref ls t))
(f (+ h 1) (- t 1))]
[else #f])))))


(3)说明

这里给出的方案都是根据题目要求给出的,并不一定在实际开发中是最优的。比如,方法(1)虽然清晰,但是
reverse
操作重新分配列表,如果列表足够的大的话,会导致内存分配失败;方法(2)的
list-ref
每次操作都是
O(n)
,性能不高。

虽然列表是
lisp
最受欢迎的数据结构,但也开始引入其他数据结构,比如
vector
hashtable
等。比如上面的问题就可以使用
vector
更加高效地完成。

Scheme是尾递归优化的,在解决方案中也没有刻意写成尾递归,因为这会破坏递归的自然性,影响可读性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lisp 回文 lambda scheme