CS 3 Lecture 8 Advanced recursion 1 Schedule




















- Slides: 20
CS 3: Lecture 8 Advanced recursion 1
Schedule Oct 10 Advanced recursion Oct 17 Number-spelling Miniproject Oct 24 Higher order procedures Oct 31 More HOF Lists! (instead of sentences and words) Nov 7 Recursion (extra advanced) Nov 14 Midterm #2 Nov 21 The big project! 2
Next lab: Catch-up day 3
Number Spelling miniproject • Read Simply Scheme, page 233, which has hints • Another hint (principle): don't force "everything" into the recursion. – Special cases may be easier to handle before you send yourself into a recursion 4
Recursive patterns • Most recursive functions that operate on a sentence fall into: – Mapping: square-all – Counting: count-vowels, count-evens – Finding: member, first-even – Filtering: keep-evens – Testing: all-even? – Combining: sum-evens 5
"Tail" recursions • Accumulating recursions are sometimes called "Tail" recursions (by TAs, me, etc). 6
Tail recursions and efficiency • A tail recursion has no combiner, so it can end as soon as a base case is reached – Compilers can do this efficiently • An embedded recursion needs to combine up all the recursive steps to form the answer – The poor compiler has to remember everything 7
Tail or embedded? (1/3) (define (length sent) (if (empty? sent) 0 (+ 1 (length (bf sent))))) 8
Embedded! (length '(a b c d)) (+ 1 (length '(b c d))) (+ 1 (length '(c d)))) (+ 1 (length '(d))))) (+ 1 (length '()))))) (+ 1 0)))) (+ 1 1))) (+ 1 2)) (+ 1 3) 4 9
Tail or embedded? (2/3) (define (sent-max sent) (if (empty? sent) '() (sent-max-helper (bf sent) (first sent)))) (define (sent-max-helper sent max-so-far) (if (empty? sent) max-so-far (sent-max-helper (bf sent) (first sent)))) 10
Tail or embedded? (3/3) (define (find-evens sent) (cond ((empty? sent) ; base case '() ) ((odd? (first sent)) ; rec case 1 (find-evens (bf sent)) ) (else ; rec case 2: even (se (first sent) (find-evens (bf sent))) ) )) 11
> (find-evens '(2 3 4 5 6)) sent = ( 2 3 4 5 6 ) (se 2 sent = ( 3 4 5 6 ) sent = ( 4 5 6 ) (se 4 sent = ( 5 6 ) sent = ( 6 ) (se 6 sent = ( ) () (se 2 (se 4 (se 6 ()) (2 4 6) 12
Advanced recursions (1/3) "when it does more than one thing at a time" • Ones that traverse multiple sentences – E. g. , mad-libs takes a sentence of replacement words [e. g. , ‘(fat Henry three)] and a sentence to mutate [e. g. , ‘(I saw a * horse named * with * legs)] 13
Advanced recursions (2/3) • Recursions that have an inner and an outer recursion (no-vowels '(I like to type)) ("" lk t typ) (l 33 t '(I like to type)) (i 1 i/<3 +0 +y. P 3) (strip-most-popular-letter '(cs 3 is the best class)) (c 3 i th bet cla) (occurs-in? 'abc 'abxcde) #f 14
Advanced recursions (3/3) • Tree recursion: multiple recursive calls in a single recursive step • There are many, many others 15
Advanced recursion columns (C) 0 1 2 3 4 5 . . . 0 1 r o w s 1 1 1 2 1 3 3 1 (R) 4 1 4 6 4 1 5 10 10 5 1 . . . . Pascal’s Triangle . . . . • How many ways can you choose C things from R choices? • Coefficients of the (x+y)^R: look in row R • etc. 16
(define (pascal C R) (cond ((= C 0) 1) ; base case ((= C R) 1) ; base case (else ; tree recurse (+ (pascal C (- R 1)) (pascal (- C 1) (- R 1)) ))) 17
> (pascal 2 5) (+ (pascal 2 4) (+ (pascal 2 3) (+ (pascal 2 2) 1 (pascal 1 2) (+ (pascal 1 1) 1 (pascal 0 2) 1 (pascal 1 3) (pascal 1 4) (+ (pascal 1 3) (pascal 1 2) (+ (pascal 0 2) 1 (pascal 1 1) 1 (pascal 0 3) 1 18
pair-all • Write pair-all, which takes a sentence of prefixes and a sentence of suffixes and returns a sentence pairing all prefixes to all suffixes. – (pair-all ‘(a b c) ‘(1 2 3)) (a 1 b 1 c 1 a 2 b 2 c 2 a 3 b 3 c 3) – (pair-all ‘(spr s k) ‘(ite at ing ong)) (sprite sprat spring sprong site sat sing song kite kat king kong) 19
binary • Write binary, a procedure to generate the possible binary numbers given n bits. (binary 1) (0 1) (binary 2) (00 01 10 11) (binary 3) (000 001 010 011 100 101 110 111) 20