2.40
(define (unique-pairs n) (flatmap (lambda (i) (map (lambda (j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n)))
2.41
(define (gentuple n s) (filter (lambda (x) (= (accumulate + 0 x) s)) (flatmap (lambda (i) (flatmap (lambda (j) (map (lambda (k) (list i j k)) (enumerate-interval 1 (- j 1)))) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n))))
2.42
行号列号从1开始。从右向左逐步构造棋盘
(define empty-board '())(define (adjoin-position new-row k rest-of-queens) (cons new-row rest-of-queens))(define (safe? k positions) (define (iter ex-row ex1 ex2 lst) (if (null? lst) #t (if (or (= ex-row (car lst)) (= ex1 (car lst)) (= ex2 (car lst))) #f (iter ex-row (- ex1 1) (+ ex2 1) (cdr lst))))) (let ((c (car positions))) (iter c (- c 1) (+ c 1) (cdr positions))))
2.43
对于2.42中的程序,当board-size为n时,queens-cols调用1+n次;
对于Louis的程序:当k=1时,queens-cols会调用board-size次;当k=2时,queens-cols会调用board-size乘以当k=1时的次数;归纳得,queens-cols会调用board-size的board-size次方次。
于是Louis的程序的运行时间大约为2.42程序的board-size的board-size -1次方倍,
即:(* (expt board-size (- board-size 1)) T)