Lecture 12, July 14
The lecture notes I post serve two purposes: to remind you of the topics we discussed and to provide any interesting code examples I did during lecture. I would describe these notes as an outline, not a summary, of what I talked about during lecture. You are not expected to be able to learn the material simply from examining these notes, nor is reading these notes a reasonable substitute for attending lecture.
Sorting Algorithms
; insert a number into a sorted list
; If the input is sorted, then the output will also be sorted
(: insert : Real (Listof Real) -> (Listof Real))
(define (insert n l)
(cond
[(empty? l) (list n)]
[(< n (first l)) (cons n l)]
[else (cons (first l) (insert n (rest l)))]))
(: isort : (Listof Real) -> (Listof Real))
;(define (isort l)
; (cond
; [(empty? l) '()]
; [else (insert (first l) (isort (rest l)))]))
(define (isort l)
(foldl insert '() l))
(isort (build-list 20 (λ ([n : Nonnegative-Integer]) (random 100))))
; Merges two lists into one
; If the input lists are sorted, then the output list is sorted
(: merge : (Listof Real) (Listof Real) -> (Listof Real))
(define (merge l m)
(cond
[(empty? l) m]
[(empty? m) l]
[(< (first l) (first m)) (cons (first l) (merge (rest l) m))]
[else (cons (first m) (merge l (rest m)))]))
(: msort : (Listof Real) -> (Listof Real))
(define (msort l)
(cond
[(or (empty? l)
(empty? (rest l))) l]
[else
(local
{(: half-len : Integer)
(define half-len (quotient (length l) 2))
(: first-half : (Listof Real))
(define first-half (take l half-len))
(: second-half : (Listof Real))
(define second-half (drop l half-len))}
(merge (msort first-half)
(msort second-half)))]))
(msort (build-list 20 (λ ([n : Nonnegative-Integer]) (random 100))))
(: qsort : (Listof Real) -> (Listof Real))
(define (qsort l)
(cond
[(empty? l) '()]
[else
(local
{(: p : Real)
(define p (first l))
(: first-half : (Listof Real))
(define first-half (filter (λ ([x : Real]) (< x p)) (rest l)))
(: second-half : (Listof Real))
(define second-half (filter (λ ([x : Real]) (>= x p)) (rest l)))}
(append (qsort first-half)
(cons p (qsort second-half))))]))
(qsort (build-list 20 (λ ([n : Nonnegative-Integer]) (random 100))))
Efficiency
Eliminating duplicated computations in recursive functions can create dramatically faster programs.
(: fib : Integer -> Integer)
(define (fib n)
(cond
[(<= n 1) 1]
[else (+ (fib (- n 1)) (fib (- n 2)))]))
; Computes the nth fibbonaci number if a and b are both 1
(: fast-fib : Integer Integer Integer -> Integer)
(define (fast-fib n a b)
(cond
[(<= n 1) b]
[else (fast-fib (- n 1) b (+ a b))]))
(: fib2 : Integer -> Integer)
(define (fib2 n)
(local {(: fast-fib : Integer Integer Integer -> Integer)
(define (fast-fib n a b)
(cond
[(<= n 1) b]
[else (fast-fib (- n 1) b (+ a b))]))}
(fast-fib n 1 1)))
(time (fib 37))
(time (fib2 37))