欢迎感兴趣的同学指出其中的问题:-) ;2.40 ;flatmap中的proc应该是给定元素x,能做出多个含x的序对序列的过程 (define (flatmap proc seq) (accumulate append '() (map proc seq))) (define (enumerate-interval low high) (if (> low high) '() (cons low (enumerate-interval (+ low 1) high)))) ;(enumerate-interval 1 10) (define (unique-pairs n) (flatmap (lambda (i) (map (lambda (j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 2 n))) ;(unique-pairs 6) (define (prime-sum? pair) (prime? (+ (car pair) (cadr pair)))) (define (make-pair-sum pair) (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) (define (prime-sum-pairs n) (map make-pair-sum (filter prime-sum? (unique-pairs n)))) ;(prime-sum-pairs 10) ;2.41 (define (is-elem-of e set) (cond ((null? set) false) ((= e (car set)) true) (else (is-elem-of e (cdr set))))) ;(is-elem-of 5 (list 2 6 6)) (define (diff seqa seqb) (accumulate (lambda (a res-list) (if (is-elem-of a seqb) res-list (cons a res-list))) '() seqa)) ;(diff (list 1 2 3 4) '(1 3)) (define (expand-seq iter n seqs) (define (ex-seq seq) (map (lambda (t) (append seq (list t))) (diff (enumerate-interval 1 n) seq))) (let ((xseqs (flatmap ex-seq seqs))) (if (<= iter 0) seqs (expand-seq (- iter 1) n xseqs)))) ;(expand-seq 3 10 (list '())) ; ;2.42 ;采用一维表示法来表示八皇后的解,例如 (3 7 2 8 5 1 4 6)代表一个解,其中的数字是row number,列是隐藏的按顺序排列的。 (define (safe? k positions) ;直接看positions第k项(其实就是最后一项)与前面的几个皇后是否冲突 (define (get-kthelem k positions) (if (> k 1) (get-kthelem (- k 1) (cdr positions)) (car positions)) ) (if (< k 2) true (let ( (kelem (get-kthelem k positions)) (elem (car positions))) ;检查elem和第k项在直线上是否有冲突,检查在两条对角线上是否有冲突,发现冲突直接返回false (if (or (= elem kelem) (= (- elem (- k 1)) kelem) (= (+ elem (- k 1)) kelem)) false (safe? (- k 1) (cdr positions)))))) ;(safe? 4 (list 3 7 2 8)) ;在第row行col列放置一个皇后 (define (adjoin-position row col positions) ;col是隐藏的 (append positions (list row))) ;(adjoin-position 5 6 (list 3 6 7 8 2)) (define (queens board-size) (define (queen-cols k) ;queen-cols返回前k列所有合法的格局 (if (= k 0) (list '()) (filter (lambda (positions) (safe? k positions)) (flatmap (lambda (rest-of-queens) (map (lambda (new-row) (adjoin-position new-row k rest-of-queens)) (enumerate-interval 1 board-size))) (queen-cols (- k 1)))))) (queen-cols board-size)) (queens 8)