т.е. наше отображение будет выглядеть так:
1.
2.
3.
4.
(map (lambda (new-row)
(adjoin-position
new-row k rest-of-queens))
(enumerate-interval 1 board-size))
теперь можно приступить к генерации:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
> (map (lambda (new-row)
(adjoin-position
new-row 2 '((1 1))))
(enumerate-interval 1 8))
'(((1 1) (1 2))
((1 1) (2 2))
((1 1) (3 2))
((1 1) (4 2))
((1 1) (5 2))
((1 1) (6 2))
((1 1) (7 2))
((1 1) (8 2)))
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
> (map (lambda (new-row)
(adjoin-position
new-row 2 '((2 1))))
(enumerate-interval 1 8))
'(((2 1) (1 2))
((2 1) (2 2))
((2 1) (3 2))
((2 1) (4 2))
((2 1) (5 2))
((2 1) (6 2))
((2 1) (7 2))
((2 1) (8 2)))
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
> (map (lambda (new-row)
(adjoin-position
new-row 2 '((3 1))))
(enumerate-interval 1 8))
'(((3 1) (1 2))
((3 1) (2 2))
((3 1) (3 2))
((3 1) (4 2))
((3 1) (5 2))
((3 1) (6 2))
((3 1) (7 2))
((3 1) (8 2)))
выше приведены отдельные map-ы, генерирующие нужные списки в зависимости от параметров - предыдущего сгенерённого списка, номера строки, номера столбца.
чтобы увязать результат рекурсивной генерации в единый список, нужно накапливать результат на каждом шаге рекурсии.
поэтому нам нужна некая процедура вида
1.
2.
(define (flatmap proc seq)
(accumulate append nil (map proc seq)))
т.е. у нас есть некая процедура
proc - в нашем случае это процедура вида
1.
2.
3.
(lambda (new-row)
(adjoin-position
new-row 2 '((3 1))))
есть последовательность
seq - в нашем случае это
мы хотем аккумулировать результаты этих map-ов, начав с пустого nil.
то-есть нам нужна некоторая функция аккумулирования
accumulate, которую мы запускаем с параметрами
1.
(accumulate append nil (map proc seq))