Notes: The exercise 2.37 on Hexlet's site has an error, noted in the comments. Also, their page for exercise 2.38 should probably have 0 tests. And finally, I did not calculate the exact number in the final exercise 2.43, but I included a relevant discussion.
40 lines
No EOL
1.1 KiB
Scheme
40 lines
No EOL
1.1 KiB
Scheme
#lang sicp
|
|
|
|
(define (accumulate op initial sequence)
|
|
(if (null? sequence)
|
|
initial
|
|
(op (car sequence)
|
|
(accumulate op initial (cdr sequence)))))
|
|
|
|
(define (flatmap proc seq)
|
|
(accumulate append nil (map proc seq)))
|
|
|
|
(define (filter predicate sequence)
|
|
(cond ((null? sequence) nil)
|
|
((predicate (car sequence))
|
|
(cons (car sequence)
|
|
(filter predicate (cdr sequence))))
|
|
(else (filter predicate (cdr sequence)))))
|
|
|
|
(define (enumerate-interval a b)
|
|
(if (> a b)
|
|
'()
|
|
(cons a (enumerate-interval (+ a 1) b))))
|
|
|
|
(define (sum l) (accumulate + 0 l))
|
|
|
|
; returns a function which checks given list for
|
|
; specific sum
|
|
(define (sum-is-num s)
|
|
(lambda (list)
|
|
(= (sum list) s)))
|
|
|
|
(define (ordered-triples-with-sum n s)
|
|
(filter (sum-is-num s)
|
|
(flatmap (lambda (i)
|
|
(flatmap (lambda (j)
|
|
(map (lambda (k)
|
|
(list i j k))
|
|
(enumerate-interval 1 (- j 1))))
|
|
(enumerate-interval 1 (- i 1))))
|
|
(enumerate-interval 1 n)))) |