k-yamadaのブログ

プログラミングのメモ

SISPの進捗メモ

読書開始日

2012/11/23

進め方

問題はgauche(Schemeの方言)で解答する
問題は自力で解く。わからなかったら答え(http://community.schemewiki.org/?SICP-Solutions)をみて赤字で正答を書く。

Q1.1

gosh> 10
10
gosh> (+ 5 3 4)
12
gosh> (- 9 1)
8
gosh> (/ 6 2)
3
gosh> (+ (* 2 4) (- 4 6))
6
gosh> (define a 3)
a
gosh> (define b (+ a 1))
b
gosh> (+ a b (* a b))
19
gosh> (= a b)
#f
gosh> 
(if (and (> b a) (< b (* a b)))
    b
    a)
=>4
gosh> 
(cond ((= a 4) 6 )
         ((= b 4) (+ 6 7 a))
         (else 25))
=>16
gosh> (+ 2 (if (> b a) b a))
=>6
gosh> 
(* (cond ((> a b) a)
             ((< a b) b)
            (else -1))
    (+ a 1))
16

Q1.2

gosh> 
(/ (+ 5 
        4 
        (- 2
            (- 3
                (+ 6
                    (/ 4 5)))))
    (* 3
       (- 6 2)
       (- 2 7)))
=> 37/150

Q1.3

2012/11/25
3つの数を引数としてとり、大きい2つの数の2乗の和を返す手続き

(define (square x)
  (* x x))

(define (sum-of-squares x y)
  (+ (square x) (square y)))

(define (sum-of-squares-of-larger-2 x y z)
  (define larger-2 (cdr (sort (list x y z))))
  (sum-of-squares (car larger-2) (car (cdr larger-2)))

(sum-of-squares-of-larger-2 5 4 3)
=> 41

Q1.4

gosh> 
(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))  
a-plus-abs-b
gosh> (a-plus-abs-b 10 5)
15
gosh> (a-plus-abs-b 10 -5)
15

Q1.5

(define (p) (p))

(define (test x y)
  (if (= x 0)
  0
  y))

(test 0 (p))

goshで実行した結果フリーズした。
・作用的順序で評価する場合の振る舞い
手続きpの評価が無限ループする?
Using applicative-order evaluation, the evaluation of (test 0 (p)) never terminates, because (p) is infinitely expanded to itself:

・正規順序で評価する場合の振る舞い
0が返る?
Using normal-order evaluation, the expression evaluates, step by step, to 0:
(test 0 (p))
(if (= 0 0) 0 (p))
(if #t 0 (p))
0