welcome to cs 5! be sure to watch your head…. a recursive spiral …

86
Welcome to CS 5! Be sure to watch your head…

Upload: rudolf-bryan

Post on 28-Jan-2016

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Welcome to CS 5! Be sure to watch your head…

Page 2: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

A recursive spiral …

Page 3: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

The building blocks of functiona

l computing

We're computationally complete!

data, sequencesconditionalsrecursion

CS 5 today

List Comprehensions

map and applications

Homework 1 - submitted

Homework 2 - this coming Sunday…!4 problems 1 lab problem Monday/Tuesday

2 python problems…

What's next?

[email protected]

Not around the LAC?

1 reading problem - PageRank!

Homework 0 - graded!

Page 4: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

functional programming

>>> 'fun' in 'functional'True

Functional programming

• create small building blocks (functions)

• leverage self-similarity (recursion)

• representation via list structures (data)

Compose these together to solve or investigate problems.

elegant and concise efficient for the computer…vs.functional procedural

Page 5: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

return to recursion

Composing functions into specific applications

Creating general functions that will be useful everywhere (or almost…)

Page 6: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

return to recursion

Composing functions into specific applications

Creating general functions that will be useful everywhere (or almost…)

building blocks with which to compose…

Page 7: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

sum, range

def sum(L):

""" input: a list of numbers, L

output: L's sum

"""

if len(L) == 0:

return 0.0

else:

return L[0] + sum(L[1:])

Base Caseif the input

has no elements, its sum is

zero

Recursive Case

if L does have an element, add

that element's value to the sum of the REST of

the list…

This input to the recursive call must be "smaller" somehow…

Page 8: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

sum, range

def range(low,hi):

""" input: two ints, low and hi

output: int list from low up to hi

"""

if hi <= low:

return []

else:

return

what's cookin' here?

excluding hi

Page 9: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

sum and range

>>> sum(range(101))

Looks sort of scruffy for a 7-year old… !

and 100 more…

http://www.americanscientist.org/template/AssetDetail/assetid/50686

1784

Page 10: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Recursion: Good News/Bad News

Recursion is fundamental in functional programming:

def dblList(L):

""" Doubles all the values in a list.

input: L, a list of numbers """

if L == []:

return L

else:

return [ L[0]*2 ] + dblList(L[1:])

But you can sometimes hide it away!Is this supposed to be the good news or the bad news?

Page 11: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Map ?

def dbl(x):

return 2*x

def sq(x):

return x**2

def isana(x):

return x == 'a'

>>> map( dbl, [0,1,2,3,4,5] )[0, 2, 4, 6, 8, 10]

>>> map( sq, range(6) )[0, 1, 4, 9, 16, 25]

>>> map( isana, 'go away!' )[0, 0, 0, 1, 0, 1, 0, 0]

Hey… this looks a bit False to

me!

output

output

output

What does map do?

Page 12: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Map !

def dbl(x):

return 2*x

def sq(x):

return x**2

>>> map( dbl, [0,1,2,3,4,5] )[0, 2, 4, 6, 8, 10]

>>> map( sq, range(6) )[0, 1, 4, 9, 16, 25]

>>> map( isana, 'go away!' )[0, 0, 0, 1, 0, 1, 0, 0]

Hey… this looks a bit False to

me!

(1) map always returns a list

(2) map(f,L) calls f on each item in L

def isana(x):

return x == 'a'

Page 13: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Map !

def dblList(L): """ Doubles all the values in a list. input: L, a list of numbers """ if L == []: return L else: return [L[0]*2] + dblList(L[1:])

Without map

def dbl(x): return x*2

def dblList(L): """ Doubles all the values in a list. input: L, a list of numbers """ return map(dbl, L)

With map!

Page 14: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Map: a higher-order function

In Python, functions can take other functions as input…

def map( f, L ):

""" map returns a new list where each element of L has been f-efied

"""

if

else:

Hey - I'm the only star allowed around here…

Key Idea Functions are data!

Page 15: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

>>> [ 2*x for x in [0,1,2,3,4,5] ][0, 2, 4, 6, 8, 10]

>>> [ y**2 for y in range(6) ][0, 1, 4, 9, 16, 25]

>>> [ c == 'a' for c in 'go away!' ][0, 0, 0, 1, 0, 1, 0, 0]

What is going on here?

output

output

output

input

input

input

The same as map!

this is trouble for

dbl…

Page 16: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

>>> [ 2*x for x in [0,1,2,3,4,5] ][0, 2, 4, 6, 8, 10]

>>> [ y**2 for y in range(6) ][0, 1, 4, 9, 16, 25]

>>> [ c == 'a' for c in 'go away!' ][0, 0, 0, 1, 0, 1, 0, 0]

Anything you want to happen to

each element of a list

output

output

output

input

input

input

name that takes on the value of each element in

turnthe list (or

string)any name is OK!

Is this really the best name Guido Van Rossum

could think of?

this is trouble for

dbl…

Page 17: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

>>> [ 2*x for x in [0,1,2,3,4,5] ][0, 2, 4, 6, 8, 10]

>>> [ y**2 for y in range(6) ][0, 1, 4, 9, 16, 25]

>>> [ c == 'a' for c in 'go away!' ][0, 0, 0, 1, 0, 1, 0, 0]

Anything you want to happen to

each element of a list

output

output

output

input

input

input

name that takes on the value of each element in

turnthe list (or

string)any name is OK!

Some possible alternatives

Google's Maps

One-hit wonders

Lazy lists

this is trouble for

dbl…

Page 18: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

def len(L): if L == []: return 0 else: return 1 + len(L[:])

len(L)

implemented via raw recursion

A list comprehension by any other name would be as sweet…

sScore(s)def sScore(s): if len(s) == 0: return 0 else: return letScore(s[0]) + \

sScore(s[1:])

scrabble score

sajak(s)def sajak(s): if len(s) == 0: return 0 else: if s[0] not in 'aeiou': return sajak(s[1:]) else: return 1+sajak(s[1:])

# of vowels

Page 19: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

LC = [1 for x in L] return sum( LC )

len(L)

A list comprehension by any other name would be as sweet…

sScore(s)scrabble score LC = [ letScore(c) for c in s]

return sum( LC )

sajak(s)LC = [ for c in s]return sum( LC )

# of vowels

Remember True == 1 and False == 0

Page 20: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Quiz Write each of these functions concisely using map or list comprehensions…

Write def count(e,L):

Write def lotto(Y,W):

input: e, any element L, any list or stringoutput: the # of times L contains e example: count('f', 'fluff') == 3

input: Y and W, two lists of lottery numbers (ints)output: the # of matches between Y & W example: lotto([5,7,42,44],[3,5,7,44]) == 3

Y are your numbersW are the winning numbers

Name(s):

Remember True == 1 and False == 0

Extra! Write def divs(N):

input: N, an int >= 2output: the number of positive divisors of Nexample: divs(12) == 6 (1,2,3,4,6,12)

How could you use this to compute all of the prime

numbers up to P?

LC = [ for x in L ]return sum(LC) don't use e

here!use e in here somehow…

def primesUpto( P ):

Page 21: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Write def lotto(Y,W):

input: Y and W, two lists of lottery numbers (ints)output: the # of matches between Y & W example: lotto([5,7,42,44],[3,5,7,44]) == 3

Y are your numbersW are the winning numbers

Page 22: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Extra! Write def divs(N):

input: N, an int >= 2output: the number of positive divisors of Nexample: divs(12) == 6 (1,2,3,4,6,12)

How could you use this to compute all of the prime

numbers up to P?def primesUpto( P ):

Page 23: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

return to recursion

Composing functions into specific applications

Creating general functions that will be useful everywhere (or almost…)

what applications?

Page 24: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

1 102 3 4 5 6 7 8 9

1

0.5

0

y = 1 x area

steps(low,hi,N) fsteps(recip,low,hi,N)

def recip(x): return 1.0/x

finteg(f,low,hi,N)

Numerical IntegrationLab 2: Monday or

Tuesday

Page 25: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

1 102 3 4 5 6 7 8 9

1

0.5

0

1 102 3 4 5 6 7 8 9

1

0.5

0

low = 1.0 hi = 10.0

y = 1 x area

steps(low,hi,N)

N == 9 == total number of steps (rectangles)

fsteps(recip,low,hi,N)

def recip(x): return 1.0/x

finteg(f,low,hi,N)

Page 26: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

"two-by-four landscape"

Maya Lin, Computer Scientist…

Page 27: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

One building block, carefully applied, over 50,000 times…

Maya Lin, Computer Scientist…

Page 28: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

The Visual Arts?

from csturtle import *

reset()

left(90)

forward(50)

right(90)

backward(50)

down() or up()

color('green')

tracer(1) or tracer(0)

width(5)

and lots more!

www.cs.hmc.edu/twiki/bin/view/CS5/CsturtleDirections

for csturtle help

degrees!

states if the pen draws or not

states if the pen animates

or not

Page 29: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

See you at Lab!

Page 30: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

The Python shell

IDLE uses Python's graphics - but built-in shells do not

"command window" "terminal

window"

c:\python25\python -i hw2pr1.py

python -i hw2pr1.py

Page 31: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

csplot.py

Links to pages with detailed instructions on

opening a non-IDLE shell.

Links to two files providing graphics

capabilities.

IDLE can still be used as your code editor!

Page 32: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

A random aside…

import random

random.choice( L )

random.uniform(low,hi)

random.choice( ['north', 'case', 'west'] )

random.uniform(41.0, 43.0)

chooses 1 element from the list L

chooses a random float from low to hi

for more explanation, try dir(random) or help(random)

How likely is this to return 42 ?

How would you get a random int from 0 to 9?

Page 33: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Randomness vs. Determinism

Are there random numbers?

Output

RNG

Can a computer generate them?

A “black box” model of a random number generator.

Page 34: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Randomness vs. Determinism

Are there random numbers?

Can a computer generate them?

The RNG revealed.

Output

Yes Not without help!

http://en.wikipedia.org/wiki/Mersenne_twister

Periodic!

p = 219937-1

Page 35: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Some random history…

True randomness is valuable!

http://www.rand.org/pubs/monograph_reports/MR1418/index.html

but not that valuable!

Inevitable correlations among the published values

Page 36: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

True Randomness !

LavaRnd’s lava lamps

using a chaotic physical system to seed random number generators

(Patent 5,732,138: "Method for seeding a pseudo-random number generator with a

cryptographic hash of a digitization of a chaotic system.")

This has since been “improved”…

www.wired.com/wired/archive/11.08/random.html

an enthusiastic endorser

http://www.leapzine.com/hr/random, but not!

Page 37: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

A random program…

print guesses ?

num guesses ?

from random import *

def guess( hidden ): """ guesses the user's #, "hidden" """ compguess = choice( range(100) )

if compguess == hidden: # at last! print 'I got it!'

else: guess( hidden )

This guesser is a bit suspicious…

Page 38: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

The two Monte Carlos

Monte Carlo casino, Monaco

Making random numbers work for you!

Monte Carlo methods, Math/CS

Page 39: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Monte Carlo in action

Suppose you roll two dice.What are the chances that you roll doubles?

def countDoubles( N ): """ inputs a # of two-dice rolls outputs the # of doubles """ if N == 0: return 0 else: d1 = choice( [1,2,3,4,5,6] ) d2 = choice( range(1,7) ) if d1 != d2: return countDoubles( N - 1 ) else: return

one roll of two dice

where is the doubles check?

input is the total number of rolls

what should the last line be?

Page 40: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

1 102 3 4 5 6 7 8 9

1

0.5

0

1 102 3 4 5 6 7 8 9

1

0.5

0

low = 1.0 hi = 10.0

y = 1 x area

steps(low,hi,N)

N == 9 == total number of steps (rectangles)

fsteps(recip,low,hi,N)

def recip(x): return 1.0/x

finteg(f,low,hi,N)

How might we find this area using Monte Carlo?

Page 41: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

1 102 3 4 5 6 7 8 9

1

0.5

0

y = 1 x area

steps(low,hi,N) fsteps(recip,low,hi,N)

def recip(x): return 1.0/x

finteg(f,low,hi,N)

Numerical IntegrationLab 2: Monday or

Tuesday

Page 42: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

See you at Lab!

Page 43: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

print: Making programs talk to you!

Debugging had to be discovered. I can remember the exact instant

when I realized that a large part of my life from then on was going to be spent in finding mistakes

in my own programs.- Maurice Wilkes

Programming: the art of debugging an empty file.- The Jargon File

http://www.tuxedo.org/~esr/jargon/

Page 44: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

The first bug

Grace Hopper

“In the days they used oxen for heavy pulling, when one ox couldn't budge a log, they didn't try to grow a larger ox. We shouldn't be trying for bigger and better computers, but for

better systems of computers.”

from the UNIVAC 1

Page 45: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

1. Find out what CS is really all about2. Meet other women (and a few men

too) who do CS3. Bond with your fellow Mudders

(including Prof. Alvarado)4. Helen Greiner (!) and Sally Ride are

keynote speakers5. Get a free trip to San Diego…

Top 5 reasons to sign up to come to the

Page 46: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

When is it? October 4-7 (we’ll leave Wed. afternoon and return Sat. night)

Who can sign up? Anyone! You don’t have to be a CS Major (or a woman)

How do I sign up?Email Christine ([email protected]) by Friday, Sept. 22

Where do I get more information?http://www.cs.hmc.edu/~alvarado/ghc06.htmlhttp://gracehopper.org/

Page 47: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Real visual recursion

How many times has the light bounced before reaching the camera from various items here??

Page 48: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Quiz

Extra: How could this be modified to find the 'ctg' repeats that cause

myotonic dystrophy?

Write each of these two functions concisely using list comprehensions…

Write def countas(s):

input: s, a stringoutput: the # of 'a' characters in sexample: countas('alphabet') == 2

return sum( [ x=='a' for x in s ] )

return sum( [ x=='ctg' for x in s ] )

return sum( [ s[i:i+3]=='ctg' for i in range(len(s)) ] )

Page 49: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …
Page 50: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Solutions

The descent? - to deeper and deeper understandings of these things ("too deep" Fox Trot cartoon)

Show a high-level (using map, reduce, etc.) solution for each and a low-level (raw recursion) for each.

The ascent - composing more sophisticated applications

Page 51: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Syntax

Show the list comprehension syntax…

Do some examples & puzzles

Have a puzzle with if (used as a filter, too)

Try out the new syntax…

Page 52: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Specification:Let W be a list of the six current winning lotto numbers (in order). A “ticket” is a list of six elements: [#1, #2, #3, #4, #5, #6 ], also in order. lottoScore(T) inputs a ticket and outputs its number of matches.

Examples:

W = [ 4, 8, 15, 29, 33, 47 ];lottoScore([14, 15, 28,

30, 31, 42]); 1

lottoScore([4, 8, 15, 16, 32, 33]);4

Code:

Page 53: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Specification:

lottoScore(W,T) takes both the winning numbers and a ticket as inputs and returns the number of matches... .

Example:

lottoScore( [4, 8, 15, 29, 33, 47], [4, 8, 15, 16, 32, 33] ); 4

Code:

“merge” technique ...

Page 54: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Today's forecast…

dropGemini(L) takes in a list of birthdays (pairs like [6,5]) and returns an identical list w/o the Gemini.

Specification:Example:Code:

dropGemini([ [2,19], [3,13], [5,28], [6,11], [6,13], [7,29] ]); [ [2,19], [3,13], [7,29] ]

US style

Page 55: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Applications Lottery ticket applications -

my favorite! with prizes for solvers

Page 56: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Do you remember…

That should do it… review slide.Look ahead to lab.

Look ahead to Wed. :

-revisiting randomness (lottery tie-in)

- show a quick teaser example of the coolness of list comprehensions, e.g., analyze the primality instinct game by playing 1000000 times and counting the number of wins…

Page 57: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Recursion -- warning !

def fac(N): return N * fac(N-1)

This is legal code!

try it out…

fall forever… was that Dumbledore or Gandalf?

Page 58: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Recursion Examples

def matchscore(a,b):

""" input: any two strings, a and b

output: the number of same characters in

the same location in both a and b

"""

This sentence is false.

Page 59: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

The building blocks of functiona

l computing

Living without a bass case!http://www.stylusmagazine.com/articles/weekly_article/stylus-magazines-top-50-basslines-of-all-time.htm

We're computationally complete!

John Paul Jones, Paul McCartney, Flea (jazz Charles Mingus), Jakes: Phil Lesh

data, sequencesconditionalsrecursion

CS 5 today

So what now?

Page 60: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

1 102 3 4 5 6 7 8 9

1

0.5

0

1 102 3 4 5 6 7 8 9

1

0.5

0

nsteps = 9

area

xmin = 1.0 xmax = 10.0

y = 1 x

Page 61: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

sum

>>> L = [1,2,3,4]

>>> sum(L)

def sum(L): """ input: a list of numbers, L output: L's sum """ if len(L) == 0: return 0.0 else: return L[0] + sum(L[1:]) sum([1,2,3,4])

L[0] + sum(L[1:])

L

1 + sum([2,3,4])

Page 62: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Depends what you mean by real …

(show recursion.swf)

Page 63: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …
Page 64: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

A recursive spiral …

Page 65: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …
Page 66: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

sum, range, max

def max(L):

""" input: a nonempty sequence of values, L

output: L's maximum

"""

if len(L) == 1:

return L[0]

elif

max( [ 5, 42, 1, 7, 100 ] )

Page 67: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

sum, range, max

def max(L):

""" input: a nonempty sequence of values, L

output: L's maximum

"""

if len(L) == 1:

return L[0]

elif L[0] > L[1]:

return max( L[0:1] + L[2:] )

else:

return max( L[1:] )

Page 68: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

max( [3, 7, 1, 42, -10, 1024, 55, 716] )

How many times does each block get called for this 8-element list?

def max(L): """ docstring here """ if len(L) == 1: return L[0] elif L[0] > L[1]: return max( L[0:1] + L[2:] ) else: return max( L[1:] )

Base Case (if)

Second Case (elif)

Third Case (else)

Page 69: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

max( [3, 7, 1, 42, -10, 1024, 55, 716] )

How many times does each block get called for this 8-element list?

def max(L): """ docstring here """ if len(L) == 1: return L[0] elif L[0] > L[1]: return max( L[0:1] + L[2:] ) else: return max( L[1:] )

max( [7, 1, 42, -10, 1024, 55, 716] )Third Case (else)

Base Case (if)

Second Case (elif)

Third Case (else)

Page 70: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

max( [3, 7, 1, 42, -10, 1024, 55, 716] )

How many times does each block get called for this 8-element list?

def max(L): """ docstring here """ if len(L) == 1: return L[0] elif L[0] > L[1]: return max( L[0:1] + L[2:] ) else: return max( L[1:] )

max( [7, 1, 42, -10, 1024, 55, 716] )

max( [7, 42, -10, 1024, 55, 716] )Second Case (elif)

Third Case (else)

Base Case (if)

Second Case (elif)

Third Case (else)

Page 71: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

max( [3, 7, 1, 42, -10, 1024, 55, 716] )

How many times does each block get called for this 8-element list?

def max(L): """ docstring here """ if len(L) == 1: return L[0] elif L[0] > L[1]: return max( L[0:1] + L[2:] ) else: return max( L[1:] )

max( [7, 1, 42, -10, 1024, 55, 716] )

max( [7, 42, -10, 1024, 55, 716] )

max( [42, -10, 1024, 55, 716] )

max( [42, 1024, 55, 716] )

max( [1024, 55, 716] )

max( [1024, 716] )

max( [1024] )

1024Base Case (if)

Second Case (elif)

Second Case (elif)

Third Case (else)

Second Case (elif)

Second Case (elif)

Third Case (else)

Third Case (else)

Base Case (if)

Second Case (elif)

Third Case (else)

Page 72: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Quiz

Extra: How could this be modified to find the 'ctg' repeats that cause

myotonic dystrophy?

Write each of these two functions concisely using list comprehensions…

Write def countas(s):

Write def lottoScore(Y,W):

input: s, a stringoutput: the # of 'a' characters in sexample: countas('alphabet') == 2

input: Y and W, two lists of ints (lottery numbers)output: the # of matching numbers in Y & W example: lottoScore([5,7,42,44],[3,5,7,44]) == 3

Y are your numbersW are the winning numbers

Name(s):

Remember True == 1 and False == 0

Page 73: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

def len(L):

if L == []:

return 0

else:

return 1 + len(L[:])

def len(L):

return sum( )

len

Raw Recur-sion

List Comp

last time

this time

A list comprehension by any other name would be as sweet…

len

Page 74: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

def len(L):

if L == []:

return 0

else:

return 1 + len(L[:])

def len(L):

return sum( [ 1 for x in L ] )

len

Raw Recursion

List Comp

Page 75: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

def scrabbleScore(s):

if len(s) == 0:

return 0

else:

return recursive step

def scrabbleScore(s):

return sum( )

scrabbleScore

Raw Recursion

List Comp

last time

this time

Page 76: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

List Comprehensions

def scrabbleScore(s):

if len(s) == 0:

return 0

else:

return recursive step

def scrabbleScore(s):

return sum( [ letScore(x) for x in s ] )

scrabbleScore

Raw Recursion

List Comp

Page 77: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Write def countas(s):

input: s, a stringoutput: the # of 'a' characters in sexample: countas('alphabet') == 2

Page 78: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Note: does this work for strings?

Write def lottoScore(Y,W):

input: Y and W, two lists of ints (lottery numbers)output: the # of matching numbers in Y & W example: lottoScore([5,7,42,44],[3,5,7,44]) == 3

Y are your numbersW are the winning numbers

Page 79: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Extra: How could this be modified to find the 'ctg' repeats that cause

myotonic dystrophy?

Write def countas(s):

input: s, a stringoutput: the # of 'a' characters in sexample: countas('alphabet') == 2

return sum( [ x=='a' for x in s ] )

Page 80: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Extra: How could this be modified to find the 'ctg' repeats that cause

myotonic dystrophy?

Write def countas(s):

input: s, a stringoutput: the # of 'a' characters in sexample: countas('alphabet') == 2

return sum( [ x=='a' for x in s ] )

return sum( [ x=='ctg' for x in s ] )

Does this work?

Page 81: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Extra: How could this be modified to find the 'ctg' repeats that cause

myotonic dystrophy?

Write def countas(s):

input: s, a stringoutput: the # of 'a' characters in sexample: countas('alphabet') == 2

return sum( [ x=='a' for x in s ] )

return sum( [ x=='ctg' for x in s ] ) No!

return sum( [ s[i:i+3]=='ctg' for i in range( ) ] )

What range should this be?

Page 82: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Map, recursively

def map(f,L):(1) map always returns a list

(2) map(f,L) calls f on each item in L

Page 83: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

Summary of today…

>>> [ 2**x for x in range(10) ]

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

>>> map( math.sqrt, [0, 1, 4, 9] )

[0.0, 1.0, 2.0, 3.0]

max, min, range, sum, len, …

list comprehensions

map

building blocks…

Page 84: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

while we're here…

def rps(): """ plays rock-paper-scissors """ answer = 'yes'

while answer == 'yes': # # plays RPS one time # answer = raw_input('Again? ')

print 'Bye!' there's self-similarity here, for sure!

loop while the

test is true

test

outside of the loop

Page 85: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

No while needed!

def rps(): """ plays rock-paper-scissors """ # # plays RPS one time # answer = raw_input('Again? ')

if answer == 'yes': rps() # recurse! else: print 'Bye!'

Page 86: Welcome to CS 5! Be sure to watch your head…. A recursive spiral …

One of the RPS programs…

if name == 'Rock': # is it Rock? print 'I too choose Rock! However, mine is larger. I win.'

elif name == 'Paper': # otherwise, is it Paper? print 'I choose Rock! Rock can rip through Paper. I win.'

elif name == 'Scissors': # otherwise, is it Scissors? print 'I choose Rock! Rock can smash Scissors. I win.'

else: # in the case of typos or silly choices... print name, '????' print 'Don\'t you know how to play Rock, Paper, Scissors?! NOTE: program is case-sensitive! Please capitalize all selections in the future. In the meantime...I win by default!'