mirror of
https://github.com/correl/sicp.git
synced 2024-11-23 19:19:56 +00:00
Section 2.1.3
This commit is contained in:
parent
fdffa1f6b5
commit
4944d5ceec
1 changed files with 154 additions and 0 deletions
154
2-1.org
154
2-1.org
|
@ -76,6 +76,7 @@ layout: org
|
||||||
(cons (/ n g) (/ d g))))))
|
(cons (/ n g) (/ d g))))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
* Abstraction Barriers
|
||||||
** Exercise 2.2
|
** Exercise 2.2
|
||||||
Consider the problem of representing line segments in a plane.
|
Consider the problem of representing line segments in a plane.
|
||||||
Each segment is represented as a pair of points: a starting point
|
Each segment is represented as a pair of points: a starting point
|
||||||
|
@ -224,3 +225,156 @@ layout: org
|
||||||
(define (width-rectangle r) (car (cdr r)))
|
(define (width-rectangle r) (car (cdr r)))
|
||||||
(define (height-rectangle r) (cdr (cdr r)))
|
(define (height-rectangle r) (cdr (cdr r)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
* What is Meant by Data
|
||||||
|
** Exercise 2.4
|
||||||
|
Here is an alternative procedural representation of pairs. For
|
||||||
|
this representation, verify that `(car (cons x y))' yields `x' for
|
||||||
|
any objects `x' and `y'.
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
;; Exercise 2.4
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
|
||||||
|
(define (cons x y)
|
||||||
|
(lambda (m) (m x y)))
|
||||||
|
|
||||||
|
(define (car z)
|
||||||
|
(z (lambda (p q) p)))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
What is the corresponding definition of `cdr'? (Hint: To verify
|
||||||
|
that this works, make use of the substitution model of section
|
||||||
|
*Note 1-1-5::.)
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
(define (cdr z)
|
||||||
|
(z (lambda (p q) q)))
|
||||||
|
#+end_src
|
||||||
|
** Exercise 2.5
|
||||||
|
Show that we can represent pairs of nonnegative integers using only
|
||||||
|
numbers and arithmetic operations if we represent the pair a and b
|
||||||
|
as the integer that is the product 2^a 3^b. Give the corresponding
|
||||||
|
definitions of the procedures `cons', `car', and `cdr'.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
;; Exercise 2.5
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
|
||||||
|
(define (cons a b)
|
||||||
|
(* (expt 2 a) (expt 3 b)))
|
||||||
|
|
||||||
|
(define (factor-count n x count)
|
||||||
|
(if (= 0 (remainder x n))
|
||||||
|
(factor-count n (/ x n) (+ 1 count))
|
||||||
|
count))
|
||||||
|
|
||||||
|
(define (car p)
|
||||||
|
(factor-count 2 p 0))
|
||||||
|
|
||||||
|
(define (cdr p)
|
||||||
|
(factor-count 3 p 0))
|
||||||
|
#+end_src
|
||||||
|
** Exercise 2.6
|
||||||
|
In case representing pairs as procedures wasn't mind-boggling
|
||||||
|
enough, consider that, in a language that can manipulate
|
||||||
|
procedures, we can get by without numbers (at least insofar as
|
||||||
|
nonnegative integers are concerned) by implementing 0 and the
|
||||||
|
operation of adding 1 as
|
||||||
|
|
||||||
|
#+begin_src scheme
|
||||||
|
(define zero (lambda (f) (lambda (x) x)))
|
||||||
|
|
||||||
|
(define (add-1 n)
|
||||||
|
(lambda (f) (lambda (x) (f ((n f) x)))))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
This representation is known as "Church numerals", after its
|
||||||
|
inventor, Alonzo Church, the logician who invented the [lambda]
|
||||||
|
calculus.
|
||||||
|
|
||||||
|
Define `one' and `two' directly (not in terms of `zero' and
|
||||||
|
`add-1'). (Hint: Use substitution to evaluate `(add-1 zero)').
|
||||||
|
Give a direct definition of the addition procedure `+' (not in
|
||||||
|
terms of repeated application of `add-1').
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
(define one (lambda (f) (lambda (x) (f x))))
|
||||||
|
(define two (lambda (f) (lambda (x) (f (f x)))))
|
||||||
|
|
||||||
|
(define (add a b)
|
||||||
|
(lambda (f)
|
||||||
|
(lambda (x)
|
||||||
|
((a f) ((b f) x)))))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* Extended Exercise: Interval Arithmetic
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
;; ===================================================================
|
||||||
|
;; 2.1.4: Extended Exercise: Interval Arithmetic
|
||||||
|
;; ===================================================================
|
||||||
|
|
||||||
|
(define (add-interval x y)
|
||||||
|
(make-interval (+ (lower-bound x) (lower-bound y))
|
||||||
|
(+ (upper-bound x) (upper-bound y))))
|
||||||
|
|
||||||
|
(define (mul-interval x y)
|
||||||
|
(let ((p1 (* (lower-bound x) (lower-bound y)))
|
||||||
|
(p2 (* (lower-bound x) (upper-bound y)))
|
||||||
|
(p3 (* (upper-bound x) (lower-bound y)))
|
||||||
|
(p4 (* (upper-bound x) (upper-bound y))))
|
||||||
|
(make-interval (min p1 p2 p3 p4)
|
||||||
|
(max p1 p2 p3 p4))))
|
||||||
|
|
||||||
|
(define (div-interval x y)
|
||||||
|
(mul-interval x
|
||||||
|
(make-interval (/ 1.0 (upper-bound y))
|
||||||
|
(/ 1.0 (lower-bound y)))))
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Exercise 2.7
|
||||||
|
Alyssa's program is incomplete because she has not specified the
|
||||||
|
implementation of the interval abstraction. Here is a definition
|
||||||
|
of the interval constructor:
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
;; Exercise 2.7
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
|
||||||
|
(define (make-interval a b) (cons a b))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Define selectors `upper-bound' and `lower-bound' to complete the
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
(define (upper-bound p)
|
||||||
|
(max (car p) (cdr p)))
|
||||||
|
|
||||||
|
(define (lower-bound p)
|
||||||
|
(min (car p) (cdr p)))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Exercise 2.8:
|
||||||
|
Using reasoning analogous to Alyssa's, describe how the difference
|
||||||
|
of two intervals may be computed. Define a corresponding
|
||||||
|
subtraction procedure, called `sub-interval'.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#+begin_src scheme :tangle yes
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
;; Exercise 2.8
|
||||||
|
;; -------------------------------------------------------------------
|
||||||
|
#+end_src
|
||||||
|
|
Loading…
Reference in a new issue