sicp練習問題2.2節試行解答

5986 ワード

練習問題2.17、list-refとlength過程を直接利用する
(define (last
-
pair items)  (list (list
-
ref items (
-
 (length items) 
1
))))
練習問題2.18、反復法を採用する
(define (reverse
-
list items)  (define (reverse
-
iter i k)    (
if
 (
null
?
 i) k (reverse
-
iter (cdr i) (cons (car i) k))))  (reverse
-
iter items ()))
練習問題2.20、もし2つの数のパリティが同じならば、彼らの差模2は0に等しくて、この点によって書くことができます:
(define (same
-
parity a . b)  (define (same
-
parity
-
temp x y)  (cond ((
null
?
 y) y)        ((
=
 (remainder (
-
 (car y) x) 
2

0
)         (cons (car y) (same
-
parity
-
temp x (cdr y))))        (
else
           (same
-
parity
-
temp x (cdr y)))))  (cons a (same
-
parity
-
temp a b)))
基本手順remainderによる型取り
練習問題2.21、再帰方式:
(define (square
-
list items)  (
if
 (
null
?
 items)      items       (cons (square (car items)) (square
-
list (cdr items)))))
mapプロセスを利用する:
(define (square
-
list items)  (map square items))
練習問題2.23、これはrubyのeachと同じ意味で、操作を集合の各要素に適用します.
(define (
for
-
each proc items)  (define (
for
-
each
-
temp proc temp items)  (
if
 (
null
?
 items)      #t      (
for
-
each
-
temp proc (proc (car items)) (cdr items))))  (
for
-
each
-
temp proc 
0
 items))
最後にtrueを返す
練習問題2.24、箱の図は描かないで、面倒で、解釈器の出力:
Welcome to DrScheme, version 
360
.Language: Standard (R5RS).
>
 (list 
1
 (list 
2
 (list 
3
 
4
)))(
1
 (
2
 (
3
 
4
)))
木の形はこうすべきだ
               . 
/\
/ \
1 .
/\
/ \
2 .
/\
/ \
3 4
練習問題2.25、
最初のlistは(list 1 3(list 5 7)9)と表すことができる.
したがって、7を取る操作は、
(car (cdr (car (cdr (cdr (list 
1
 
3
 (list 
5
 
7

9
))))))
2番目のlistは、(list(list 7))
したがって、7を取る操作は次のとおりです.
(car (car (list (list 
7
))))
3番目のlistは、次のように表すことができます.
(list 
1
 (list 
2
 (list 
3
 (list 
4
 (list 
5
 (list 
6
 
7
))))))
したがって、7を取る操作は、
(define x (list 
1
 (list 
2
 (list 
3
 (list 
4
 (list 
5
 (list 
6
 
7
)))))))(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr x))))))))))))
恐ろしい!--
練習問題2.26、純粋に問題を解いて、言わないでください
練習問題2.27、reverseの基礎の上で修正を行って、同様に反復を採用して、比較的に理解しにくいです:
(define (deep
-
reverse x)  (define (reverse
-
iter rest result)    (cond ((null? rest) result)          ((
not
 (pair? (car rest)))           (reverse
-
iter (cdr rest)                 (cons (car rest) result)))          (
else
           (reverse
-
iter (cdr rest)                 (cons (deep
-
reverse (car rest)) result)))           ))  (reverse
-
iter x ()))
練習問題2.28、再帰、appendプロセスを利用するのは簡単です:
(define (finge x)  (cond ((pair? x) (append (finge (car x)) (finge (cdr x))))        ((null? x) ())        (
else
 (list x))))
練習問題2.29、この問題が明らかになった二叉活動体も階層的な樹状構造である.
1)car,cdrを利用するのは簡単です
(define (left
-
branch x)  (car x))(define (right
-
branch x)  (car (cdr x)))(define (branch
-
length b)  (car b))(define (branch
-
structure b)  (car (cdr b)))
2)分岐の総重量を解くために、まず1つのプロセスが必要である.
(define (branch
-
weight branch)  (let ((structure (branch
-
structure branch)))    (
if
 (
not
 (pair? structure))        structure        (total
-
weight structure))))(define (total
-
weight mobile)  (
+
 (branch
-
weight (left
-
branch mobile))     (branch
-
weight (right
-
branch mobile))))
この過程を利用してbalancedを書きますか?プロセス:
(define (torque branch)  (
*
 (branch
-
length branch) (branch
-
weight branch)))(define (balanced? mobile)  (
=
 (torque (left
-
branch mobile))     (torque (right
-
branch mobile))))
3)選択関数と定義関数は抽象的なマスクを提供し、他の関数は両方に基づいているので、変更する必要があるのはselector関数だけです.
(define (right
-
branch mobile) (cdr mobile))(define (branch
-
structure branch) (cdr branch))
練習問題2.30:
(define (square
-
tree tree)  (cond ((null? tree) tree)        ((
not
 (pair? tree)) (square tree))        (
else
           (cons (square
-
tree (car tree)) (square
-
tree (cdr tree))))))(define (square
-
tree2 tree)  (map (
lambda
(x)         (
if
 (pair? x)             (square
-
tree x)             (square x))) tree))
練習問題2.31は、map-treeをさらに抽象化し、mapプロセスと同様に、procプロセスをツリーの各ノードに作用させる.
(define (tree
-
map proc tree)  (cond ((null? tree) tree)        ((
not
 (pair? tree)) (proc tree))        (
else
           (cons (tree
-
map proc (car tree)) (tree
-
map proc (cdr tree))))))(define (square
-
tree3 tree)  (tree
-
map square tree))
練習問題2.32、観察を通じてrestはいつもcdrの後のサブセットで、例えば(list 1 2 3)について、連続cdrが出てきたのは:
(2 3)
(3)
()
他の5つのサブセットは、car結果とこれらのサブセットを組み合わせた結果であるべきである.
(define (subsets s)  (
if
 (null? s)      (list s)      (let ((rest (subsets (cdr s))))        (append rest (map (
lambda
(x) (cons (car s) x)) rest)))))