More Recursion Announcements for This Lecture Prelim 1 Assignments - - PowerPoint PPT Presentation

more recursion announcements for this lecture
SMART_READER_LITE
LIVE PREVIEW

More Recursion Announcements for This Lecture Prelim 1 Assignments - - PowerPoint PPT Presentation

Lecture 16 More Recursion Announcements for This Lecture Prelim 1 Assignments and Labs Prelim 1 back today! Need to be working on A4 Pick up in Lab Section Instructions are posted Solution posted in CMS Just


slide-1
SLIDE 1

More Recursion

Lecture 16

slide-2
SLIDE 2

Announcements for This Lecture

Prelim 1

  • Need to be working on A4

§ Instructions are posted § Just reading it takes a while § Slightly longer than A3 § Problems are harder

  • Lab Today: lots of practice!

§ 4 functions are mandatory § Lots of optional ones to do § Exam questions on Prelim 2

10/20/15 2 More Recursion

  • Prelim 1 back today!

§ Pick up in Lab Section § Solution posted in CMS § Mean: 80, Median: 83

  • What are letter grades?

§ A bit too early to tell § A: Could be a consultant § B: Could take 2110 § C: Good enough to pass

Assignments and Labs

slide-3
SLIDE 3

Recall: Reversing a String

Using Recursion

def reverse(s): """Returns: reverse of s Precondition: s a string""" # s is empty if s == '': return s # s has at least one char # (reverse of s[1:])+s[0] return reverse(s[1:])+s[0]

Using a For-Loop

def reverse(s): """Returns: reverse of s Precondition: s a string""" # create an accumulator copy == '' # accumulate copy in reverse for x in s: copy = x+copy return copy

10/20/15 More Recursion 3

slide-4
SLIDE 4

Recall: Reversing a String

Using Recursion

def reverse(s): """Returns: reverse of s Precondition: s a string""" # s is empty if s == '': return s # s has at least one char # (reverse of s[1:])+s[0] return reverse(s[1:])+s[0]

Using a For-Loop

def reverse(s): """Returns: reverse of s Precondition: s a string""" # create an accumulator copy == '' # accumulate copy in reverse for x in s: copy = x+copy return copy

10/20/15 More Recursion 4

slide-5
SLIDE 5

Recall: Iteration

  • 1. Process each item in a sequence

§ Compute aggregate statistics for a dataset, such as the mean, median, standard deviation, etc. § Send everyone in a Facebook group an appointment time

  • 2. Perform n trials or get n samples.

§ OLD A4: draw a triangle six times to make a hexagon § Run a protein-folding simulation for 106 time steps

  • 3. Do something an unknown

number of times

§ CUAUV team, vehicle keeps moving until reached its goal

10/20/15 More Recursion 5

for x in sequence: process x for x in range(n): do next thing Cannot do this yet Impossible w/ Python for

slide-6
SLIDE 6

Recursion and Iteration

  • Recursion theoretically equivalent to iteration

§ Anything can do in one, can do in other § But what is easy in one may be hard in other § When is using recursion better?

  • Recursion is more flexible in breaking up data

§ Iteration typically scans data left-to-right § Recursion works with other “slicings”

  • Recursion has interesting advanced applications

§ See some of these in Assignment 4

10/20/15 More Recursion 6

slide-7
SLIDE 7

have to be the same

Example: Palindromes

  • String with ≥ 2 characters is a palindrome if:

§ its first and last characters are equal, and § the rest of the characters form a palindrome

  • Example:

AMANAPLANACANALPANAMA

  • Precise Specification:

def ispalindrome(s): """Returns: True if s is a palindrome"""

has to be a palindrome

10/20/15 7 More Recursion

slide-8
SLIDE 8

Example: Palindromes

  • String with ≥ 2 characters is a palindrome if:

§ its first and last characters are equal, and § the rest of the characters form a palindrome

  • Recursive Function:

def ispalindrome(s): """Returns: True if s is a palindrome""" if len(s) < 2: return True // { s has at least two characters } return s[0] == s[–1] and ispalindrome(s[1:-1])

Recursive case Base case Recursive Definition

10/20/15 8 More Recursion

slide-9
SLIDE 9

Example: Palindromes

  • String with ≥ 2 characters is a palindrome if:

§ its first and last characters are equal, and § the rest of the characters form a palindrome

  • Recursive Function:

def ispalindrome(s): """Returns: True if s is a palindrome""" if len(s) < 2: return True // { s has at least two characters } return s[0] == s[–1] and ispalindrome(s[1:-1])

Recursive case Base case

10/20/15 9 More Recursion

slide-10
SLIDE 10

Example: More Palindromes

def ispalindrome2(s): """Returns: True if s is a palindrome Case of characters is ignored.""" if len(s) < 2: return True // { s has at least two characters } return ( equals_ignore_case(s[0],s[–1]) and ispalindrome2(s[1:-1]) )

10/20/15 10 More Recursion

slide-11
SLIDE 11

Example: More Palindromes

Precise Specification

def ispalindrome2(s): """Returns: True if s is a palindrome Case of characters is ignored.""" if len(s) < 2: return True // { s has at least two characters } return ( equals_ignore_case(s[0],s[–1]) and ispalindrome2(s[1:-1]) )

10/20/15 11 More Recursion

slide-12
SLIDE 12

Example: More Palindromes

Precise Specification

def ispalindrome2(s): """Returns: True if s is a palindrome Case of characters is ignored.""" if len(s) < 2: return True // { s has at least two characters } return ( equals_ignore_case(s[0],s[–1]) and ispalindrome2(s[1:-1]) ) def equals_ignore_case (a, b): """Returns: True if a and b are same ignoring case""" return a.upper() == b.upper()

10/20/15 12 More Recursion

slide-13
SLIDE 13

Example: More Palindromes

def ispalindrome3(s): """Returns: True if s is a palindrome Case of characters and non-letters ignored.""" return ispalindrome2(depunct(s)) def depunct(s): """Returns: s with non-letters removed""" if s == '': return s # use string.letters to isolate letters if s[0] in string.letters: return s[0]+depunct(s[1:]) return depunct(s[1:])

10/20/15 13 More Recursion

Use helper functions!

  • Often easy to break a

problem into two

  • Can use recursion more

than once to solve

slide-14
SLIDE 14

Recursion is form of Divide and Conquer

Goal: Solve problem P on a piece of data

10/20/15 More Recursion 14

data

slide-15
SLIDE 15

Recursion is form of Divide and Conquer

Goal: Solve problem P on a piece of data

10/20/15 More Recursion 15

data

Idea: Split data into two parts and solve problem

data 1 data 2

Solve Problem P Solve Problem P

slide-16
SLIDE 16

Recursion is form of Divide and Conquer

Goal: Solve problem P on a piece of data

10/20/15 More Recursion 16

data

Idea: Split data into two parts and solve problem

data 1 data 2

Solve Problem P Solve Problem P Combine Answer!

slide-17
SLIDE 17

Recursion is form of Divide and Conquer

Goal: Solve problem P on a piece of data

10/20/15 More Recursion 17

data

Idea: Split data into two parts and solve problem

data 1 data 2

Solve Problem P Solve Problem P Combine Answer!

Where work is all done

slide-18
SLIDE 18

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 18

5 341267

Approach 1

slide-19
SLIDE 19

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 19

5 341267

Approach 1

341,267

commafy

slide-20
SLIDE 20

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 20

5 341267

Approach 1

341,267

commafy

5

slide-21
SLIDE 21

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 21

5 341267

Approach 1

341,267

commafy

5 ,

Always? When?

slide-22
SLIDE 22

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 22

5 341267

Approach 1

341,267

commafy

5 ,

Always? When?

5341 267

Approach 2

slide-23
SLIDE 23

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 23

5 341267

Approach 1

341,267

commafy

5 ,

Always? When?

5341 267

Approach 2

5,341

commafy

slide-24
SLIDE 24

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 24

5 341267

Approach 1

341,267

commafy

5 ,

Always? When?

5341 267

Approach 2

5,341

commafy

267

slide-25
SLIDE 25

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int"""

10/20/15 More Recursion 25

5 341267 341,267 ,

commafy

5341 5 267 5,341 , 267

commafy Always? When? Always!

Approach 1 Approach 2

slide-26
SLIDE 26

How to Break Up a Recursive Function?

def commafy(s): """Returns: string with commas every 3 digits e.g. commafy('5341267') = '5,341,267' Precondition: s represents a non-negative int""" # No commas if too few digits. if len(s) <= 3: return s # Add the comma before last 3 digits return commafy(s[:-3]) + ',' + s[-3:]

10/20/15 More Recursion 26

Recursive case Base case

slide-27
SLIDE 27

How to Break Up a Recursive Function?

def exp(b, c) """Returns: bc Precondition: b a float, c ≥ 0 an int"""

10/20/15 More Recursion 27

Approach 1 Approach 2 12256 = 12 × (12255)

Recursive

12256 = (12128) × (12128)

Recursive Recursive

bc = b × (bc-1) bc = (b×b)c/2 if c even

slide-28
SLIDE 28

Raising a Number to an Exponent

Approach 1

def exp(b, c) """Returns: bc Precondition: b a float, c ≥ 0 an int""" # b0 is 1 if c == 0: return 1 # bc = b(bc) return b*exp(b,c-1)

Approach 2

def exp(b, c) """Returns: bc Precondition: b a float, c ≥ 0 an int""” if c == 0: return 1 # c > 0 if c % 2 == 0: return exp(b*b,c/2) return b*exp(b*b,(c-1)/2)

10/20/15 More Recursion 28

slide-29
SLIDE 29

Raising a Number to an Exponent

def exp(b, c) """Returns: bc Precondition: b a float, c ≥ 0 an int""” # b0 is 1 if c == 0: return 1 # c > 0 if c % 2 == 0: return exp(b*b,c/2) return b*exp(b*b,c/2)

c # of calls 1 1 2 2 4 3 8 4 16 5 32 6 2n n + 1

10/20/15 More Recursion 29

32768 is 215 b32768 needs only 215 calls!

slide-30
SLIDE 30

Recursion and Objects

  • Class Person (person.py)

§ Objects have 3 attributes § name: String § mom: Person (or None) § dad: Person (or None)

  • Represents the “family tree”

§ Goes as far back as known § Attributes mom and dad are None if not known

  • Constructor: Person(n,m,d)
  • Or Person(n) if no mom, dad

10/20/15 More Recursion 30

John Sr. Pamela Eva ??? Dan Heather John Jr. ??? ??? Jane Robert Ellen John III Alice John IV

slide-31
SLIDE 31

Recursion and Objects

def num_ancestors(p): """Returns: num of known ancestors Pre: p is a Person""" # Base case # No mom or dad (no ancestors) # Recursive step # Has mom or dad # Count ancestors of each one # (plus mom, dad themselves) # Add them together

10/20/15 More Recursion 31

John Sr. Pamela Eva ??? Dan Heather John Jr. ??? ??? Jane Robert Ellen John III Alice John IV

11 ancestors

slide-32
SLIDE 32

Recursion and Objects

def num_ancestors(p): """Returns: num of known ancestors Pre: p is a Person""" # Base case if p.mom == None and p.dad == None: return 0 # Recursive step moms = 0 if not p.mom == None: moms = 1+num_ancestors(p.mom) dads = 0 if not p.dad== None: dads = 1+num_ancestors(p.dad) return moms+dads

10/20/15 More Recursion 32

John Sr. Pamela Eva ??? Dan Heather John Jr. ??? ??? Jane Robert Ellen John III Alice John IV

11 ancestors

slide-33
SLIDE 33

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Space Filling Curves

  • Draw a curve that

§ Starts in the left corner § Ends in the right corner § Touches every grid point § Does not touch or cross itself anywhere

  • Useful for analysis of

2-dimensional data Challenge

Starts Here Ends Here

10/20/15 33 More Recursion

slide-34
SLIDE 34

Hilbert(1): Hilbert(2): Hilbert(n):

H(n-1) down H(n-1) down H(n-1) left H(n-1) right

Hilbert’s Space Filling Curve

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2n 2n

10/20/15 34 More Recursion

slide-35
SLIDE 35

Hilbert’s Space Filling Curve

  • Given a box
  • Draw 2n×2n

grid in box

  • Trace the curve
  • As n goes to ∞,

curve fills box Basic Idea

10/20/15 35 More Recursion

slide-36
SLIDE 36

“Turtle” Graphics: Assignment A4

10/20/15 More Recursion 36

Turn Move Change Color Draw Line