CS3 Fall 2005 Lecture 10: More on higher order functions

advertisement
CS3 Fall 2005
Lecture 10: More on higher
order functions
Oct 24
Oct 31
Higher order procedures
More HOF
– "tic-tac-toe" program: SS chapter 10!
– "Change Making" case study, in the reader
Nov 7
Miniproject #3: Election-processing
– Friday is a holiday
– Thursday a catch-up day
– MP#3 due Thur/Fri: plan ahead!
Nov 14
Nov 21
Nov 28
Dec 5
Dec 17
Review Session: Wednesday
Midterm #2
Lists
Start on the project: check-off #1
Work on the project: checks #2
Checkoff #3, finish the project
Final Exam (midterm #3)
Administrivia
• Reading is important for this week:
– Tic-tac-toe, chapter 10 in Simply Scheme (Tuesday)
– Difference between dates part III case-study in the
reader (Tuesday)
– Change-making case-study in the reader (Thursday)
• Note: there is a limit to the number of quizzes
you can take outside of lab: 4 quizzes
• Make sure you have completed the
Mid Semester Survey
Tic Tac Toe
The board
X |
|
---+---+--O | O | X
---+---+--|
|
"X _ _"
"O O X"
"_ _ _"
"X _ _ O O X _ _ _"
Triples (another representation to help
the search for possible moves)
X |
|
---+---+--O | O | X
---+---+--|
|
"X _ _ O O X _ _ _"
( x23 oox 789 xo7 2o8 3x9 xo9 3o7 )
Higher order function (HOFs)
• A HOF is a procedure that takes a
procedure as an argument.
• There are three main ones that work with
words and sentences:
– every – do something to each element
– keep – return only certain elements
– accumulate – combine the elements
A definition of every
(define (my-every proc ws)
(if (empty? ws)
'()
(se (proc (first ws))
(my-every (bf ws))
)))
Every does a lot of work for you:
• Checking the conditional
• Returning the proper base case
• Combing the various recursive steps
• Invoking itself recursively on a smaller problem
Which HOFs would you use to
write these?
1)
capitalize-proper-names
(c-p-n '(mr. smith goes to washington))
 (mr. Smith goes to Washington)
2)
count-if
(count-if odd? '(1 2 3 4 5))  3
3)
longest-word
(longest-word '(I had fun on spring break))  spring
4)
count-vowels-in-each
(c-e-l '(I have forgotten everything))  (1 2 3 3)
5)
squares-greater-than-100
(s-g-t-100 '(2 9 13 16 9 45)  (169 256 2025)
6)
sum-of-squares
(sos '(1 2 3 4 5 6 7)  30
7)
successive-concatenation
(sc '(a b c d e)  (a ab abc abcd abcde)
Write successive-concatenation
(sc '(a b c d e))
 (a ab abc abcd abcde)
(sc '(the big red barn))
 (the thebig thebigred thebigredbarn)
(define (sc sent)
(accumulate
(lambda ??
)
sent))
HOF: Base cases can be confusing
• What does (every
square '())
– (every square "")
– (every square "12345")
• What about (keep
odd? '())
– (keep odd? "")
• How about (accumulate
–
–
–
–
–
–
(accumulate
(accumulate
(accumulate
(accumulate
(accumulate
(accumulate
+
'())
+ "")
* '())
word '(a))
+ '(a)
word '(a b))
+ '(a b))
return?
lambda
• "lambda" is a special form that returns a
function:
(lambda (param1 param2 …)
statement1
statement2
)
(lambda (x) (* x x)  [a function]
(every (lambda (x) (* x x) '(1 2 3 4))
 (1 4 9 16)
Can a function defined by a
lambda be recursive?
(lambda (sent)
(if (empty? sent)
'()
(se (square (first sent))
(???? (bf sent)))))
When do you NEED lambda?
1. When you need the context (inside a
two-parameter procedure)
(add-suffix '-is-great '(nate sam mary))
 (nate-is-great sam-is-great
mary-is-great)
2. When you need to make a function on
the fly
Procedures that make procedures
• Generally, name procedures that create
procedures "make-XXX"
(make-bookends 'o)
 #[closure arglist=(inner-wd) d7d0e0]
((make-bookends 'o) 'hi)  ohio
((make-bookends 'to) 'ron)  toronto
(define tom-bookend
(make-bookends 'tom))
(tom-bookends "")  tomtom
Download