想不到第一次写八皇后问题是用的scm
写代码的途中遇到一个错误,用let错了,用define对了,应该是编译器的原因,和nil差不多。
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))
(define (enumerate-interval low high)
(if (> low high) '() (cons low (enumerate-interval (+ low 1) high))))
(define (fliter predicate sequence)
(cond ((null? sequence) '())
((predicate (car sequence))
(cons (car sequence) (fliter predicate (cdr sequence))))
(else (fliter predicate (cdr sequence)))))
(define (flatmap proc seq)
(accumulate append '() (map proc seq)))
(define (queens board-size)
(define (queen-cols k)
(if (= k 0)
(list empty-board)
(fliter
(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))
(define empty-board '(nil))
(define (adjoin-position new-row k rest-of-queens)
(append (list (list new-row k)) rest-of-queens))
(define (vec positions)
(define nl newline)
(nl)
(display positions)
(nl)
(display (car positions))
(nl)
(display (cadr positions)))
(define (safe? k positions)
(define (iter i Mat)
(if (= i 1)
#t
(if (cmp (car positions) (cadr Mat))
(iter (- i 1) (cdr Mat))
#f)))
(define (cmp a1 a2)
(define x1 (car a1))
(define y1 (cadr a1))
(define x2 (car a2))
(define y2 (cadr a2))
(not (or (= x1 x2) (= y1 y2) (= (- x2 x1) (- y2 y1)) (= (- x1 x2) (- y2 y1)))))
(iter k positions))
(newline)
(display (queens 8))