P06 (*) 判断一个列表是否是回文列表
2015-12-18 22:32
176 查看
大维基百科的原话:
A palindrome is a word, phrase, number, or other sequence of >characters which reads the same backward or forward.
回文是一个结构,满足回文结构的事物从前或从后遍历元素得到的结果是相同的。具体事物的元素的单位可能是不同的,如一个单词,字符是其元素;一个词组,元素可能是单词;一篇文章,段落可能是其元素。 如,
回文列表有什么特征呢,
虽然列表是
Scheme是尾递归优化的,在解决方案中也没有刻意写成尾递归,因为这会破坏递归的自然性,影响可读性。
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是尾递归优化的,在解决方案中也没有刻意写成尾递归,因为这会破坏递归的自然性,影响可读性。
相关文章推荐
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- C#实现回文检测的方法
- C++实现的一个可以写递归lambda的Y函数
- C#特性之匿名方法和Lambda表达式
- 理解C#中的Lambda表达式
- 初步认识C#中的Lambda表达式和匿名方法
- C#3.0中Lambda表达式详解
- C#基础之Lambda表达式用法实例教程
- PHP输出两个数字中间有多少个回文数的方法
- PHP判断一个字符串是否是回文字符串的方法
- 深入理解Java中的Lambda表达式
- Java8新特性之Lambda表达式浅析
- Java Lambda表达式详解和实例
- java判断回文数示例分享
- Java函数式编程(一):你好,Lambda表达式
- 用Python编写一个简单的Lisp解释器的教程
- python中lambda与def用法对比实例分析
- Python lambda和Python def区别分析
- Python中的特殊语法:filter、map、reduce、lambda介绍