![Page 1: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/1.jpg)
CS61A Lecture 5Applications of
Higher Order FunctionsJon Kotker and Tom Magrino
UC Berkeley EECSJune 25, 2012
![Page 2: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/2.jpg)
2
COMPUTER SCIENCE IN THE NEWSHappy 100th Birthday, Alan Turing!
http://upload.wikimedia.org/wikipedia/en/c/c8/Alan_Turing_photo.jpg
• Born on June 23, 1912.• Father of computer science and
artificial intelligence.• Described hypothetical
computational machines, now called Turing machines, before the first mechanical computer existed!
• Helped break ciphers during World War II.
• Also contributed to mathematical biology.
![Page 3: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/3.jpg)
3
TODAY
• Practice with higher order functions and anonymous functions, and
• Applications of higher order functions:– Project 1 demonstration.– Iterative improvement.
![Page 4: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/4.jpg)
4
RECAP: HIGHER ORDER FUNCTIONS
Higher order functions are functions that caneither take functions as arguments
or return a function.
![Page 5: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/5.jpg)
5
ASIDE: FIRST-CLASS CITIZENS
In a programming language, an entity is a first-class citizen if:1. It can be named by variables.2. It can be passed as arguments to functions.3. It can be returned from functions.4. It can be included in data structures.(We will see a few data structures in module 2.)
In Python, data and functions are both first-class citizens.This may not be true in other programming languages.
![Page 6: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/6.jpg)
6
REVIEW: ANONYMOUS FUNCTIONS
Lambda expressions and defined functions
λ
<name> = lambda <arguments>: <expression>
def <name>(<arguments>):return <expression>
![Page 7: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/7.jpg)
7
REVIEW: ANONYMOUS FUNCTIONS
square = lambda x: x * x
def square(x):return x*x
λLambda expressions and defined functions
![Page 8: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/8.jpg)
8
REVIEW: ANONYMOUS FUNCTIONS
What will the following expression return?(lambda x: x*5)(3+7)
![Page 9: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/9.jpg)
9
REVIEW: ANONYMOUS FUNCTIONS
What will the following expression return?(lambda x: x*5)(3+7)
50
![Page 10: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/10.jpg)
10
REVIEW: APPLICATIVE ORDER
To evaluate a compound expression:Evaluate the operator and then the operands, andApply the operator on the operands.
This is the applicative order of evaluation.
![Page 11: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/11.jpg)
11
APPLICATIVE ORDER: EVALUATE
(lambda x: x*5)(3+7)
evaluates to evaluates to
xreturn
x*510
![Page 12: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/12.jpg)
12
APPLICATIVE ORDER: APPLY
xreturn
x*5
1050
![Page 13: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/13.jpg)
13
REVIEW: ANONYMOUS FUNCTIONS
What will the following expression return?(lambda x: x*5)((lambda y: y+5)
(3))
![Page 14: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/14.jpg)
14
REVIEW: ANONYMOUS FUNCTIONS
What will the following expression return?(lambda x: x*5)((lambda y: y+5)
(3))40
![Page 15: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/15.jpg)
15
ANONYMOUS AND HIGHER ORDER FUNCTIONS
def compose(f, g): return lambda x: f(g(x))
yreturn
g(y) zreturn
f(z)
x
f(g(x))compose(f, g)
![Page 16: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/16.jpg)
16
ANONYMOUS AND HIGHER ORDER FUNCTIONS
increment = lambda num: num+1square = lambda num: num*numidentity = lambda num: num
Which of the following expressions are valid, and if so, what do they evaluate to?compose(increment, square)compose(increment, square)(2)compose(square, increment)(2)compose(square, square(2))(3)
![Page 17: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/17.jpg)
17
ANONYMOUS AND HIGHER ORDER FUNCTIONS
increment = lambda num: num+1square = lambda num: num*numidentity = lambda num: num
Which of the following expressions are valid, and if so, what do they evaluate to?compose(increment, square)Function that squares a number and then adds 1.compose(increment, square)(2)5compose(square, increment)(2)9compose(square, square(2))(3)Error
![Page 18: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/18.jpg)
18
ANONYMOUS AND HIGHER ORDER FUNCTIONS
twice = lambda f: compose(f, f)
Which of the following expressions are valid, and if so, what do they evaluate to?twice(increment)(1)twice(twice(increment))(1)twice(square(3))(1)twice(lambda: square(3))(1)
![Page 19: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/19.jpg)
19
ANONYMOUS AND HIGHER ORDER FUNCTIONS
twice = lambda f: compose(f, f)
Which of the following expressions are valid, and if so, what do they evaluate to?twice(increment)(1)3twice(twice(increment))(1)5twice(square(3))(1)Errortwice(lambda: square(3))(1)Error
![Page 20: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/20.jpg)
20
ANONYMOUS AND HIGHER ORDER FUNCTIONS
def twice(f): return lambda x: f(f(x))
Which of the following expressions are valid, and if so, what do they evaluate to?twice(lambda x: square(3))(1)twice(identity)()(twice(twice))(increment)(1)
![Page 21: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/21.jpg)
21
ANONYMOUS AND HIGHER ORDER FUNCTIONS
def twice(f): return lambda x: f(f(x))
Which of the following expressions are valid, and if so, what do they evaluate to?twice(lambda x: square(3))(1)9twice(identity)()Error(twice(twice))(increment)(1)5
![Page 22: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/22.jpg)
22
ANONYMOUS AND HIGHER ORDER FUNCTIONS
def twice(f): return lambda x: f(f(x))
Which of the following expressions are valid, and if so, what do they evaluate to? twice(twice(twice))(increment)(1)(twice(twice))(twice(increment))(1)
![Page 23: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/23.jpg)
23
ANONYMOUS AND HIGHER ORDER FUNCTIONS
def twice(f): return lambda x: f(f(x))
Which of the following expressions are valid, and if so, what do they evaluate to? twice(twice(twice))(increment)(1)17(twice(twice))(twice(increment))(1)9
![Page 24: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/24.jpg)
24
ANNOUNCEMENTS
• Homework 3 is released and due June 29.• Project 1 is also due June 29.• The homework 0 for the staff will be available
tonight.
![Page 25: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/25.jpg)
25
PROJECT 1: THE GAME OF PIG
Dice game described by John Scarne in 1945.
Number of players: Two.Goal: To reach a score of 100.Played with: Six-sided die and four-sided die.Rating: ½★★★★
http://www.amazon.com/Winning-Moves-1046-Pass-Pigs/dp/B00005JG3Y
Image from http://en.wikipedia.org/wiki/File:Pass_pigs_dice.jpg
![Page 26: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/26.jpg)
26
PROJECT 1: THE GAME OF PIGGAMEPLAY
One player keeps rolling a die, remembering the sum of all rolls (the turn total), until:1. Player holds, adding the turn total (now the
turn score) to the total score, or2. Player rolls a 1, adding only 1 (the turn score) to
the total score.
![Page 27: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/27.jpg)
27
PROJECT 1: THE GAME OF PIGRISK
Player can either pig out and keep rolling, or hold and keep the turn total.
![Page 28: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/28.jpg)
28
PROJECT 1: THE GAME OF PIGDIE RULE
At the beginning of a player’s turn, if the sum of the two scores is a multiple of 7, the player uses the four-sided die, not the six-sided die.
![Page 29: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/29.jpg)
29
PROJECT 1: THE GAME OF PIG
http://cdn0.hark.com/images/000/001/157/1157/original.jpghttp://www.lazylaces.com/pics/01/center_shall_we_play_a_game.jpg
![Page 30: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/30.jpg)
30
PROJECT 1: THE GAME OF PIGHIGHER ORDER FUNCTIONS
Every player has a strategy, or a game plan.A strategy determines the player’s tactics.
A tactic supplies an action on each roll.A player can either keep rolling or hold.
![Page 31: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/31.jpg)
31
PROJECT 1: THE GAME OF PIGHIGHER ORDER FUNCTIONS
What is a strategy?A higher order function that uses the player’s
current score and the opponent’s score to return a tactic for a particular turn.
What is a tactic?A higher order function that uses the turn total
to determine the next action.
![Page 32: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/32.jpg)
32
PROJECT 1: THE GAME OF PIGHIGHER ORDER FUNCTIONS
What is an action?Two functions (roll and hold) that use the turn
total and the die roll to calculate:the turn score, the new turn total, and if the
player’s turn is over.
![Page 33: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/33.jpg)
33
PROJECT 1: THE GAME OF PIGPHASES
Phase 1: Simulator – Simulate gameplay between two players.Phase 2: Strategies – Test a family of strategies and devise your own strategy.
![Page 34: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/34.jpg)
34
PROJECT 1: THE GAME OF PIGTIPS
• Keep track of the domain and range of your functions.
• Remember: a strategy returns a tactic, which returns an action, which returns useful values.
• Start early.• DBC: Ask questions!
![Page 35: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/35.jpg)
35
PROBLEM SOLVINGTHE RICHARD FEYNMAN APPROACH
Step 1: Write down the problem.Step 2: Think real hard.Step 3: Write down the solution.
(suggested by Murray Gell-Mann, a colleague of Feynman’s)
![Page 36: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/36.jpg)
36
PROBLEM SOLVINGITERATIVE IMPROVEMENT
Step 1: Write down the problem.Step 2: Guess an answer to the problem.Step 3: If the guess is approximately correct, it is the solution. Otherwise, update the guess, go back to step 2 and repeat.
Iteration refers to repeating something
to reach a goal.
![Page 37: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/37.jpg)
37
PROBLEM SOLVINGITERATIVE IMPROVEMENT
def iter_improve(update, isclose, guess=1): while not isclose(guess): guess = update(guess) return guess
isclose and update must be functions!
iter_improve is thus
a higher order function.
![Page 38: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/38.jpg)
38
PROBLEM SOLVINGITERATIVE IMPROVEMENT
def iter_improve(update, isclose, guess=1): while not isclose(guess): guess = update(guess) return guess
Need to choose the initial guess, the check for
approximate correctness, and the update function.
![Page 39: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/39.jpg)
39
NEWTON’S METHOD
Used to find the roots (or zeros) of a function f, where the function evaluates to zero.
𝑓 (𝑥)=𝑥2 –2
x = 1.414213562373...A “zero”
http://en.wikipedia.org/wiki/File:GodfreyKneller-IsaacNewton-1689.jpg
![Page 40: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/40.jpg)
40
NEWTON’S METHOD
Many mathematical problems are equivalent to finding roots of specific functions.
Square root of 2 is , ≡ Root of Power of 2 that is 1024 ≡ Root of
Number that is one less than its square, or ≡ Root of
“Equivalent to”
![Page 41: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/41.jpg)
41
NEWTON’S METHOD
1. Start with a function and a guess .
2. Compute the value of the function at .
3. Compute the derivative of at , .
4. Update guess to be .Animation: http://en.wikipedia.org/wiki/File:NewtonIteration_Ani.gif
𝒙
𝒇 (𝒙)
𝑓 ′ (𝑥 )=Change in 𝑦Change in 𝑥 =
0− 𝑓 (𝑥)𝑥𝑛𝑒𝑤−𝑥
𝒙𝒏𝒆𝒘
− 𝒇 (𝒙)𝒇 ′ (𝒙)
![Page 42: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/42.jpg)
42
NEWTON’S METHOD
def approx_deriv(f, x, dx=0.000001): return (f(x + dx) – f(x))/dx
def approx_eq(x, y, tolerance=1e–5): return abs(x – y) < tolerance
def approx_zero(x): return approx_eq(x, 0)
1 x 10–5 = 0.00001
![Page 43: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/43.jpg)
43
NEWTON’S METHOD
def newton_update(f): return lambda x: x – f(x)/approx_deriv(f, x)
We do not need to make a new update function for every function, thanks to higher order functions.
Generalization is a powerful theme.
![Page 44: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/44.jpg)
44
NEWTON’S METHOD
def iter_improve(update, isclose, guess=1): while not isclose(guess): guess = update(guess) return guess def find_root(f, initial_guess=10): return iter_improve(newton_update(f), lambda x: approx_zero(f(x)), initial_guess)
Why must this be a function?
![Page 45: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/45.jpg)
45
NEWTON’S METHOD
Square root of 2 is , ≡ Root of find_root(lambda x:x**2 – 2)
Power of 2 that is 1024 ≡ Root of find_root(lambda x:2**x – 1024)
Number that is one less than its square, or ≡ Root of find_root(lambda x:x**2 – x – 1)
![Page 46: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/46.jpg)
46
ASIDE: NEWTON FRACTAL
𝑓 (𝑥 )=𝑥5−1http://upload.wikimedia.org/wikipedia/commons/b/bf/Newtroot_1_0_0_0_0_m1.png
Each colored region refers to one root, and the initial guesses that will eventually converge to that root.
![Page 47: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/47.jpg)
47
NEWTON’S METHODIncredibly powerful, but does not always work!
Certain conditions need to be satisfied: for example, the function needs to be differentiable.
The method can fail in many ways, including:1. Infinite loop among a set of guesses. (Try .)2. Guesses may never fall within the tolerance for
approximate equality.3. Guesses converge to the answer very slowly.
![Page 48: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/48.jpg)
48
PROBLEM SOLVINGITERATIVE IMPROVEMENT (WITH ONE FIX)
We can add a limit on the number of iterations.
def iter_improve(update, isclose, guess=1, max_iter=5000): counter = 1 while not isclose(guess) and counter <= max_iter: guess = update(guess) counter += 1 return guess
![Page 49: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/49.jpg)
49
PROBLEM SOLVINGITERATIVE IMPROVEMENT (OTHER EXAMPLES)
Finding the square root of a number (Babylonian method or Heron’s method)
Update: Implementation:
Write my_sqrt(a) using iter_improve.(What function should we use as the update function?)
![Page 50: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/50.jpg)
50
PROBLEM SOLVINGITERATIVE IMPROVEMENT (OTHER EXAMPLES)
Software development
Write a first draft of code and tests that prove the code works as specified.Then, consider making the code more efficient, each time ensuring the tests pass.
Update
Check for correctness
![Page 51: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/51.jpg)
51
CONCLUSION
• Iterative improvement is a general problem-solving strategy, where a guess at the answer is successively improved towards the solution.
• Higher order functions allow us to express the update and the check for correctness within the framework of this strategy.
• Preview: Can a function call itself?
![Page 52: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/52.jpg)
52
EXTRAS: ASTERISK NOTATIONVariadic functions can take a variable number of arguments.
>>> def fn(*args):... return args>>> foo = fn(3, 4, 5)>>> foo(3, 4, 5)>>> a, b, c = foo>>> a3>>> bar = fn(3, 4)>>> bar(3, 4)
Here, the asterisk signifies that
the function can take a variable
number of arguments.
The arguments provided are
stored in the variable args.
![Page 53: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/53.jpg)
53
EXTRAS: ASTERISK NOTATION
>>> def bar(a, b, c):... print a, b, c>>> args = 2, 3, 4>>> bar(*args)2 3 4
Here, the asterisk “expands” the values in the variable args to “fill up” the arguments to bar.
![Page 54: CS61A Lecture 5 Applications of Higher Order Functions](https://reader036.vdocument.in/reader036/viewer/2022062520/568161b3550346895dd17a86/html5/thumbnails/54.jpg)
54
EXTRAS: CURRYING
(lambda x: lambda y: (x*5)+y)(3)(4)is equivalent to
(lambda x, y: (x*5)+y)(3, 4)
Currying allows us to represent multiple variable functions with single-variable functions.It is named after Haskell Curry, who rediscovered it after Moses Schönfinkel.Intuition: When evaluating a function from left to right, we are temporarily making several functions with fewer arguments along the way.