the spells we write direct a process
(define (sum-of-squares x y) (+ (square x) (square y))) (define (square x) (* x x)) (sum-of-squares 3 4) ;; --> 25
25
we can develop mental models for how these processes behave the simplest of these is the substitution model
KINDS OF EXPRESSIONS (* denotes special case):
numbers
symbols
λ-expressions*
definitions*
conditionals*
combinations
SUBSTITUTION RULE: to evaluate an application,
evaluate operator to get procedure
evaluate operands to get arguments
apply the procedure to the arguments
copy body of the procedure, sub args for formal params
exaluate resulting body
(sum-of-squares 3 4) (+ (square 3) (square 4)) (+ (square 3) (* 4 4)) (+ (square 3) 16) (+ (* 3 3) 16) (+ 9 16) 25
learn to ignore details! what not to compute! what not to think!
to evaluate an IF expr:
evaluate the predicate
if it yields TRUE
evaluate consequent
otherwise
evaluate alternate
(IF <predicate> <consequent> <alternative>)
"any sorceror will tell you, if you have the name of something, you have power over it"
an important program we will revisit using "peano arithmetic" (define (+ x y) (if (= x 0) y (+ (-1+ x) (1+ y))))
(+ 3 4) (if (= 3 0) 4 (+ (-1+ 3) (1+ 4)) (+ (-1+ 3) (1+ 4)) (+ (-1+ 3) 5) (+ 2 5) (if (= 2 0) 5 (+ (-1+ 2 (1+ 5)))) (+ 1 6) (+ 0 7) 7
like photography, there are simple rules, but to be a creative person, we must be able to do analysis. to get an imagined result, what techniques must be employed.
back to peano arithmetic, two ways to add whole numbers: (define (+ x y) (if (= x 0) y (+ (-1+ x) (1+ y)))) (define (+ x y) (if (= x 0) y (1+ (+ (-1+ x) y))))
;; (+ 3 4) (+ 3 4) ;; (+ 2 5) (+1 (+ 2 4)) ;; (+ 1 6) (+1 (+1 (+ 1 4))) ;; (+ 0 7) (+1 (+1 (+1 (+ 0 4)))) ;; 7 (+1 (+1 (+1 4))) ;; (+1 (+1 5)) ;; (+1 6) ;; 7
on the left: time = O(x), space = O(1) ;;iterative! on the rght: time = O(x), space = O(x) ;;recursive!
recursion is bureaucratic ("keeps more ppl employed!") iteration has all its state in its variables recursion keeps some information under the table
here are some programs, using probably the worst way you can write them
for fibbonacci numbers, (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))
; fib 4 ; / \ ; fib 3 fib 2 ; / \ / \ ; fib 2 fib 1 fib 1 fib 0 ; / \ | | | ; fib 1 fib 0 1 1 0 ; | | ; 1 0
time: O(fib n) space: O(n)
ppl think programming is hard bc you are describing a general process to describe any specific case.
for towers of hanoi, (define (move n from to spare) (cond ((= n 0) "done") (else (move (-1+ n) from spare to) (print-move from to) (move (-1+ n) spare to from)))) (move-tower 4 1 2 3) ;; move 4-high tower using pegs 1, 2, 3 (move-tower 3 1 3 2) - (move … (move-tower 2 1 2 3) - (move … (move-tower 1 1 3 2) - (move …