《電腦程式的構造與解釋》(七)

2021-06-22 08:59:28 字數 1616 閱讀 9015

(define (square_list ls)

(cond ((null? ls) null)

(else (cons (* (car ls) (car ls))

(square_list (cdr ls))))))

square_list是以ls為引數,計算每個元素的平方,然後再構成list並返回。如果需要對list作其他操作,比如開方、加一等呢?通過定義map過程能方便的進行類似的操作,如(map proc ls)。這裡的proc可以是任意的包含乙個元素引數的過程,這個map過程返回的是proc作用在ls元素中的結果所構成的list。

(define (map proc ls)

(cond ((null? ls) null)

(else (cons (proc (car ls))

(map proc (cdr ls))))))

再乙個例子,定義乙個過程實現兩個list合併。

(cond ((null? ls1) ls2)

(define (revers ls)

(cond ((null? ls) null)

還可以通過定義輔助過程,通過尾遞迴的方式將list中的元素加入到累加器中。這是尾遞迴的典型應用。

(define (revers2 ls)

(define (revers_aux ls acc)

(cond ((null? ls) acc)

(else (revers_aux (cdr ls) (cons (car ls) acc)))))

(revers_aux ls null))

再改進reverse過程,實現deep-reverse。

;

(define (deep_revers ls)

(define (revers_aux ls acc)

(cond ((null? ls) acc)

((not (pair? ls)) (cons ls acc))

(else (revers_aux (cdr ls) (revers_aux (car ls) acc)))))

(revers_aux ls null))

(deep_revers '(1 2 (3 4) ( 5 6 7)))

;-> '(7 6 5 4 3 2 1)

與之前的map過程不同,tree-map能遍歷整顆樹,而不僅僅是list。然後將proc作用在每個元素上,並返回原來的樹結構,只是新元素代替了舊元素。

(define (tree-map proc ls)

(cond ((null? ls) null)

((not (pair? ls)) (proc ls))

(else (cons (tree-map proc (car ls))

(tree-map proc (cdr ls))))))

> (tree-map inc '(1 2 (3 4)))

;->'(2 3 (4 5))

>(tree-map square '(1 2 (3 4))

;->'(1 4 (9 16))

《電腦程式的構造與解釋》(五)

抽象的資料是由基本資料型別組合而成。這顯然需要程式語言提供 粘合劑 使得能夠方便的構造抽象資料。是包含兩個元素的復合資料物件。這個元素既可以是基本元素如數字 字母,也可以是另乙個序對。scheme語言中基本過程cons取兩個引數,返回乙個包含這兩個引數作為其成分的復合資料物件 如果給了乙個序對,可以...

電腦程式的構造和解釋 SICP

又名 structure and interpretation of computer programs,second edition 譯者 裘宗燕 isbn 9787111135104 頁數 473 定價 45.0 出版社 機械工業出版社 裝幀 平裝 出版年 2004 2 1 本書1984年出版,...

電腦程式的構造與解釋作業 練習1 16到1 19

1.16 這個題目就是直譯一下題目裡面的公式。看開始我看了一下前面的題目,就高高興興的寫出來了。如下 define even?n remainder n 2 0 define fast expt b n cond n 0 1 even?n fast expt b b n 2 else b fast ...