From 8b52e1f31c0570c4180f1772f9d1226d349be37c Mon Sep 17 00:00:00 2001 From: Ramakrishnan Muthukrishnan Date: Thu, 28 Jul 2011 22:25:28 +0530 Subject: [PATCH] solutions to 3.64, 3.65, 3.66, 3.67, 3.68 and 3.69 --- src/sicp/ex3_64.rkt | 10 ++++++++++ src/sicp/ex3_65.rkt | 7 +++++++ src/sicp/ex3_66.rkt | 14 ++++++++++++++ src/sicp/ex3_67.rkt | 22 ++++++++++++++++++++++ src/sicp/ex3_68.rkt | 9 +++++++++ src/sicp/ex3_69.rkt | 11 +++++++++++ 6 files changed, 73 insertions(+) create mode 100644 src/sicp/ex3_64.rkt create mode 100644 src/sicp/ex3_65.rkt create mode 100644 src/sicp/ex3_66.rkt create mode 100644 src/sicp/ex3_67.rkt create mode 100644 src/sicp/ex3_68.rkt create mode 100644 src/sicp/ex3_69.rkt diff --git a/src/sicp/ex3_64.rkt b/src/sicp/ex3_64.rkt new file mode 100644 index 0000000..19f5d15 --- /dev/null +++ b/src/sicp/ex3_64.rkt @@ -0,0 +1,10 @@ +#lang planet neil/sicp + +;; stream-of-numbers -> floating point number -> number +(define (stream-limit s limit) + (let ([num0 (stream-car s)] + [num1 (stream-car (stream-cdr s))]) + (let ([diff (- num0 num1)]) + (if (< (abs diff) limit) + num1 + (stream-limit (stream-cdr s) limit))))) \ No newline at end of file diff --git a/src/sicp/ex3_65.rkt b/src/sicp/ex3_65.rkt new file mode 100644 index 0000000..7d5be8a --- /dev/null +++ b/src/sicp/ex3_65.rkt @@ -0,0 +1,7 @@ +#lang racket + +(define (ln2-summands n) + (cons-stream (/ 1.0 n) + (stream-map - (ln2-summands (+ n 1))))) + +(define ln2 (partial-sums (ln2-summands 1))) \ No newline at end of file diff --git a/src/sicp/ex3_66.rkt b/src/sicp/ex3_66.rkt new file mode 100644 index 0000000..530b289 --- /dev/null +++ b/src/sicp/ex3_66.rkt @@ -0,0 +1,14 @@ +#lang racket + +#| + +Writing down the pairs, one can sort of form the following judgement. + +For any particular pair of the form S0Tm, the number of terms which precedes it +is (+ (* 2 (- m 1)) 1) for m >= 2 + +For a pair of the form S1Tm, it is (* (- m 1) 4) for m >= 2. + +Similarly one can get working formulae for other row, column pairs. + +|# \ No newline at end of file diff --git a/src/sicp/ex3_67.rkt b/src/sicp/ex3_67.rkt new file mode 100644 index 0000000..7a32c7e --- /dev/null +++ b/src/sicp/ex3_67.rkt @@ -0,0 +1,22 @@ +#lang racket + +(define (interleave s1 s2) + (if (stream-null? s1) + s2 + (cons-stream (stream-car s1) + (interleave s2 (stream-cdr s1))))) + +(define (pairs s t) + (cons-stream + (list (stream-car s) (stream-car t)) + (interleave (interleave + (stream-map (lambda (x) (list (stream-car s) x)) + (stream-cdr t)) + (stream-map (lambda (y) (list y (stream-car t))) + (stream-cdr s))) + (pairs (stream-cdr s) (stream-cdr t))))) + + + + + diff --git a/src/sicp/ex3_68.rkt b/src/sicp/ex3_68.rkt new file mode 100644 index 0000000..4af41dc --- /dev/null +++ b/src/sicp/ex3_68.rkt @@ -0,0 +1,9 @@ +#lang racket + +#| + +'interleave' is a procedure and not a special form because of which the arguments +of the interleave will be evaluated before interleave itself is called. This will +result in an infinite number of calls to 'pair'. + +|# \ No newline at end of file diff --git a/src/sicp/ex3_69.rkt b/src/sicp/ex3_69.rkt new file mode 100644 index 0000000..6b0905e --- /dev/null +++ b/src/sicp/ex3_69.rkt @@ -0,0 +1,11 @@ +#lang racket + +(define (triples s t u) + (cons-stream (append (stream-car (pairs s t)) + (list (stream-car u))) + (interleave + (stream-map (lambda(p) (append p (list (stream-car u)))) + (stream-cdr (pairs s t))) + (triples (stream-cdr s) + (stream-cdr t) + (stream-cdr u))))) \ No newline at end of file -- 2.37.2