aboutsummaryrefslogtreecommitdiff
path: root/chap2/part2.rkt
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@protonmail.com>2023-07-01 16:05:51 -0500
committerJacques Comeaux <jacquesrcomeaux@protonmail.com>2023-07-01 16:05:51 -0500
commit595dc585d26cf4ef7ce5c9cc85409f4df9db4f78 (patch)
treebe5a9781c0f3f7fbce1f46bf63201b59b230807c /chap2/part2.rkt
parent4eca57397c96560d8ff79ff918006b81daa3dcbe (diff)
Begin sequence exercises
Diffstat (limited to 'chap2/part2.rkt')
-rw-r--r--chap2/part2.rkt223
1 files changed, 223 insertions, 0 deletions
diff --git a/chap2/part2.rkt b/chap2/part2.rkt
index b451cfe..b93a4c6 100644
--- a/chap2/part2.rkt
+++ b/chap2/part2.rkt
@@ -301,3 +301,226 @@
(or (not (pair? l)) (balanced? l))
(or (not (pair? r)) (balanced? r))
(= (* lweight llen) (* rweight rlen))))))
+
+(#%provide scale-tree)
+(define (scale-tree tree factor)
+ (cond
+ ((null? tree) nil)
+ ((not (pair? tree)) (* tree factor))
+ (else
+ (cons
+ (scale-tree (car tree) factor)
+ (scale-tree (cdr tree) factor)))))
+
+(#%provide scale-tree-)
+(define (scale-tree- tree factor)
+ (map
+ (lambda (sub-tree)
+ (if (pair? sub-tree)
+ (scale-tree sub-tree factor)
+ (* sub-tree factor)))
+ tree))
+
+#| 2.30 |#
+
+(#%provide square-tree-direct)
+(define (square-tree-direct tree)
+ (cond
+ ((null? tree) nil)
+ ((not (pair? tree)) (square tree))
+ (else
+ (cons
+ (square-tree-direct (car tree))
+ (square-tree-direct (cdr tree))))))
+
+(#%provide square-tree)
+(define (square-tree tree)
+ (map
+ (lambda (sub-tree)
+ (if (pair? sub-tree)
+ (square-tree sub-tree)
+ (square sub-tree)))
+ tree))
+
+#| 2.31 |#
+
+(#%provide tree-map)
+(define (tree-map proc tree)
+ (cond
+ ((null? tree) nil)
+ ((not (pair? tree)) (proc tree))
+ (else
+ (cons
+ (tree-map proc (car tree))
+ (tree-map proc (cdr tree))))))
+
+(#%provide square-tree-)
+(define (square-tree- tree)
+ (tree-map square tree))
+
+#| 2.32 |#
+
+(#%provide subsets)
+(define (subsets s)
+ (if (null? s)
+ (list nil)
+ (let
+ ((rest (subsets (cdr s))))
+ (append rest (map (lambda (x) (cons (car s) x)) rest)))))
+
+(#%provide sum-odd-squares-)
+(define (sum-odd-squares- tree)
+ (cond
+ ((null? tree) 0)
+ ((not (pair? tree))
+ (if (odd? tree) (square tree) 0))
+ (else
+ (+
+ (sum-odd-squares (car tree))
+ (sum-odd-squares (cdr tree))))))
+
+(define (fib n)
+ (define (fib-iter a b p q i)
+ (cond
+ ((= i 0) b)
+ ((even? i)
+ (fib-iter
+ a
+ b
+ (+ (square p) (square q))
+ (+ (* 2 p q) (square q))
+ (/ i 2)))
+ (else
+ (fib-iter
+ (+ (* b q) (* a q) (* a p))
+ (+ (* b p) (* a q))
+ p
+ q
+ (- i 1)))))
+ (fib-iter 1 0 0 1 n))
+
+(#%provide even-fibs-)
+(define (even-fibs- n)
+ (define (next k)
+ (if (> k n)
+ nil
+ (let ((f (fib k)))
+ (if (even? f)
+ (cons f (next (+ k 1)))
+ (next (+ k 1))))))
+ (next 0))
+
+(#%provide filter-)
+(define (filter- predicate sequence)
+ (cond
+ ((null? sequence) nil)
+ ((predicate (car sequence))
+ (cons
+ (car sequence)
+ (filter- predicate (cdr sequence))))
+ (else (filter- predicate (cdr sequence)))))
+
+(#%provide accumulate)
+(define (accumulate op initial sequence)
+ (if (null? sequence)
+ initial
+ (op
+ (car sequence)
+ (accumulate op initial (cdr sequence)))))
+
+(#%provide enumerate-interval)
+(define (enumerate-interval low high)
+ (if (> low high)
+ nil
+ (cons low (enumerate-interval (+ low 1) high))))
+
+(#%provide enumerate-tree)
+(define (enumerate-tree tree)
+ (cond
+ ((null? tree) nil)
+ ((not (pair? tree)) (list tree))
+ (else
+ (append
+ (enumerate-tree (car tree))
+ (enumerate-tree (cdr tree))))))
+
+(#%provide sum-odd-squares)
+(define (sum-odd-squares tree)
+ (accumulate + 0
+ (map square
+ (filter- odd?
+ (enumerate-tree tree)))))
+
+(#%provide even-fibs)
+(define (even-fibs n)
+ (accumulate cons nil
+ (filter- even?
+ (map fib
+ (enumerate-interval 0 n)))))
+
+(#%provide list-fib-squares)
+(define (list-fib-squares n)
+ (accumulate cons nil
+ (map square
+ (map fib
+ (enumerate-interval 0 n)))))
+
+(#%provide product-of-squares-of-odd-elements)
+(define (product-of-squares-of-odd-elements sequence)
+ (accumulate * 1
+ (map square
+ (filter- odd?
+ sequence))))
+
+#| (define (salary-of-highest-paid-programmer records) |#
+#| (accumulate max 0 |#
+#| (map salary |#
+#| (filter- programmer? |#
+#| records)))) |#
+
+#| 2.33 |#
+
+(#%provide map--)
+(define (map-- p sequence)
+ (accumulate
+ (lambda (x y) (cons (p x) y))
+ nil
+ sequence))
+
+(#%provide append--)
+(define (append-- seq1 seq2)
+ (accumulate cons seq2 seq1))
+
+(#%provide length--)
+(define (length-- sequence)
+ (accumulate (lambda (x y) (+ y 1)) 0 sequence))
+
+#| 2.34 |#
+
+(#%provide horner-eval)
+(define (horner-eval x coefficient-sequence)
+ (accumulate
+ (lambda (this-coeff higher-terms)
+ (+ (* higher-terms x) this-coeff))
+ 0
+ coefficient-sequence))
+
+#| 2.35 |#
+
+(#%provide count-leaves-)
+(define (count-leaves- t)
+ (accumulate
+ (lambda (x y) (+ y 1))
+ 0
+ (enumerate-tree t)))
+
+#| 2.36 |#
+
+(#%provide accumulate-n)
+(define (accumulate-n op init seqs)
+ (if (null? (car seqs))
+ nil
+ (cons
+ (accumulate op init (map car seqs))
+ (accumulate-n op init (map cdr seqs)))))
+