1.序列的表示
序列
序列(表)是由一个个序对组合而成的,具体来说就是让每个序对的car部分对应这个链的条目,cdr部分则是下一个序对。
对于1->2->3->4这个序列我们可以表示为:
(cons 1
(cons 2
(cons 3
(cons 4 null)))) 注:null代表表尾
为了方便,上面的序列也可以通过(list 1 2 3 4)
产生。
表操作
返回表中第n项:
- n=0,返回表的char
- n>0,返回表的cdr的第n-1项
(define (list-ref items n)
(if (= n 0)
(car items)
(list-ref (cdr items) (- n 1))))
返回表长度:
(define (length items)
(if (null? items)
0
(+ 1 (length (cdr items)))))
或
(define (length items)
(define (length-iter items n)
(if (null? items)
n
(length-iter (cdr items) (+ n 1))))
(length-iter items 0))
表的连接:
- 如果list1是空表,结果就是list2
- 否则先做出list1的cdr和list2的append,再将list1的car通过cons加到结果的前面。
(define (append list1 list2)
(if (null? list1)
list2
(cons (car list1) (append (cdr list1) list2))))
表的反转:
- 如果items为空表,返回null
- 否则返回(cdr items)的反转与(car items)的连接,因将(car items)看做是表中的一个元素(无论其本身是否为表),故在连接时要将其再次构造为表。
(define (reverse items)
(if (null? items)
null
(append (reverse (cdr items)) (list (car items)))))
对表的映射:
(define (map proc items)
(if (null? items)
null
(cons (proc (car items)) (map proc (cdr items)))))