【Scheme】序列的操作

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)))))
原文地址:https://www.cnblogs.com/cknightx/p/6800267.html