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
)))
木の形はこうすべきだ
最初の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)))))
(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)))))