SICP練習 71 練習2 42

2022-04-11 03:03:17 字數 1030 閱讀 1544



練習2.42

這道題曾經在c#中寫過,但是寫出來的**卻沒有lisp中的樸素。用了一大堆的陣列和for迴圈。但是在這裡,用car、cdr來構造就行了。

我們按書中給出的步驟來一步一步求解這個問題。首先是棋局,就按書上的示意圖,從上往下的來排皇后的位置。諸如此時書中皇后的位置為:』(6 3 1 7 5 8 2 4)。

然後就是過程adjoin-position。rest-of-queens是在前k-1列放置k-1個皇后的一種方式,new-row是在第k列放置所考慮的編號。因此這一過程定義為:

(define (adjoin-position k new-rowrest-of-queens)

(cons new-row rest-of-queens))

因為書上出現了k,我們就象徵性的將k作為乙個引數好了。像這種一行的**在前面遇見過很多次了。cons就代表則構造了吧。

空棋盤則用『()表示。因此定義如下:

(define empty-board 『())

接下來就是這道題中的關鍵了,safe?。看到棋局的樣子不用想也知道用迭代了吧。

(define (safe? k position)

(define (safe?-iter row-of-new-queen rest-of-queens i)

(if (null? rest-of-queens)

#t(let ((row-of-current-queen (carrest-of-queens)))

(if (or (= row-of-new-queenrow-of-current-queen)

(= row-of-new-queen (-row-of-current-queen i))

(= row-of-new-queen (+row-of-current-queen i)))

#t(safe?-iter row-of-new-queen (cdrrest-of-queens) (+ i 1))))))

(safe?-iter (car position) (cdr position) 1))

SICP練習 7 練習1 11

這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...

SICP練習 12 練習1 18

練習1.8 和前兩題一樣,依舊是只能用對數步數。而且這個迭代過程要基於加 加倍和折半運算。這乙個習題要用到前面的函式,因此最好的做法是,每次都將寫好的 儲存起來。load test1.18.scm 這行 可以用來載入 而儲存可以用c x,c w。以下是該題的 這次我們寫成塊結構 define x y...

SICP練習 17 練習1 23

練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...