* Lecture 1B https://youtu.be/V_7mmwpgJHU the spells we write direct a process #+BEGIN_SRC scheme (define (sum-of-squares x y) (+ (square x) (square y))) (define (square x) (* x x)) (sum-of-squares 3 4) ;; --> 25 #+END_SRC #+RESULTS: : 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 ) "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 ** the shapes of programs for shapes of processes 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)))) #+BEGIN_SRC scheme ;; (+ 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 #+END_SRC 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 ...