【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)))))
相關文章
相關標籤/搜索