【Scheme】序列的操做

1.序列的表示

序列

序列(表)是由一个个序对组合而成的,具体来讲就是让每一个序对的car部分对应这个链的条目,cdr部分则是下一个序对。
对于1->2->3->4这个序列咱们能够表示为:app

(cons 1
      (cons 2
            (cons 3
                  (cons 4 null)))) 注:null表明表尾

为了方便,上面的序列也能够经过(list 1 2 3 4)产生。code

表操做

返回表中第n项:it

  • n=0,返回表的char
  • n>0,返回表的cdr的第n-1项
(define (list-ref items n)
  (if (= n 0)
      (car items)
      (list-ref (cdr items) (- n 1))))

返回表长度:map

(define (length items)
  (if (null? items)
      0
      (+ 1 (length (cdr items)))))

co

(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)))))
相关文章
相关标签/搜索