61A Lecture 31 Announcements Efficient Sequence Processing
sum source: total: range iterator next: end: 6
Sequence Operations
Map, filter, and reduce express sequence manipulation using compact expressions
4Example: Sum all primes in an interval from a (inclusive) to b (exclusive)
def sum_primes(a, b): total = 0 x = a while x < b: if is_prime(x): total = total + x x = x + 1 return total def sum_primes(a, b): return sum(filter(is_prime, range(a, b)))
Space:
Θ(1) Θ(1)
(Demo) 1 filter source: f: is_prime 2 3 4 5 2 5 10
sum_primes(1, 6)
Streams
Streams are Lazy Scheme Lists
A stream is a list, but the rest of the list is computed only when needed:
6(car (cons 1 2)) -> 1 (cdr (cons 1 2)) -> 2 (cons 1 (cons 2 nil)) (Demo) (car (cons-stream 1 2)) -> 1 (cdr-stream (cons-stream 1 2)) -> 2 (cons-stream 1 (cons-stream 2 nil)) (cons 1 (/ 1 0)) -> ERROR (car (cons 1 (/ 1 0))) -> ERROR (cdr (cons 1 (/ 1 0))) -> ERROR (cons-stream 1 (/ 1 0)) -> (1 . #[promise (not forced)]) (car (cons-stream 1 (/ 1 0))) -> 1 (cdr-stream (cons-stream 1 (/ 1 0))) -> ERROR Errors only occur when expressions are evaluated:
Stream Ranges are Implicit
7A stream can give on-demand access to each element in order
(define (range-stream a b) (if (>= a b) nil (cons-stream a (range-stream (+ a 1) b)))) (define lots (range-stream 1 10000000000000000000)) scm> (car lots) 1 scm> (car (cdr-stream lots)) 2 scm> (car (cdr-stream (cdr-stream lots))) 3
Infinite Streams