CMSC201 Computer Science I for Majors Lecture 20 Recursion - - PowerPoint PPT Presentation

cmsc201 computer science i for majors
SMART_READER_LITE
LIVE PREVIEW

CMSC201 Computer Science I for Majors Lecture 20 Recursion - - PowerPoint PPT Presentation

CMSC201 Computer Science I for Majors Lecture 20 Recursion (Continued) Prof. Katherine Gibson Based on slides from UPenns CIS 110, and from previous iterations of the course www.umbc.edu Last Class We Covered Stacks Recursion


slide-1
SLIDE 1

www.umbc.edu

CMSC201 Computer Science I for Majors

Lecture 20 – Recursion (Continued)

  • Prof. Katherine Gibson

Based on slides from UPenn’s CIS 110, and from previous iterations of the course

slide-2
SLIDE 2

www.umbc.edu

Last Class We Covered

  • Stacks
  • Recursion

–Recursion

  • Recursion
  • Parts of a recursive function:

–Base case: when to stop –Recursive case: when to go (again)

2

slide-3
SLIDE 3

www.umbc.edu

Any Questions from Last Time?

slide-4
SLIDE 4

www.umbc.edu

Today’s Objectives

  • To gain a more solid understanding of recursion
  • To explore what goes on “behind the scenes”
  • To examine individual examples of recursion

– Binary Search – Hailstone problem (Collatz) – Fibonacci Sequence

  • To better understand when it is best to use

recursion, and when it is best to use iteration

4

slide-5
SLIDE 5

www.umbc.edu

Review of Recursion

slide-6
SLIDE 6

www.umbc.edu

What is Recursion?

  • Solving a problem using recursion means the

solution depends on solutions to smaller instances of the same problem

  • In other words, to define a function or

calculate a number by the repeated application of an algorithm

6

slide-7
SLIDE 7

www.umbc.edu

Recursive Procedures

  • When creating a recursive procedure, there

are a few things we want to keep in mind: –We need to break the problem into smaller pieces of itself –We need to define a “base case” to stop at –The smaller problems we break down into need to eventually reach the base case

7

slide-8
SLIDE 8

www.umbc.edu

“Cases” in Recursion

  • A recursive function must have two things:
  • At least one base case

– When a result is returned (or the function ends) – “When to stop”

  • At least one recursive case

– When the function is called again with new inputs – “When to go (again)”

8

slide-9
SLIDE 9

www.umbc.edu

Code Tracing: Recursion

slide-10
SLIDE 10

www.umbc.edu

Stacks and Tracing

  • Stacks will help us track what we are doing

when tracing through recursive code

  • Remember, stacks are LIFO data structures

– Last In, First Out

  • We’ll be doing a recursive trace of

the summation function

10

slide-11
SLIDE 11

www.umbc.edu

Summation Funcion

  • The addition of a sequence of numbers
  • The summation of a number is that number

plus all of the numbers less than it (down to 0)

– Summation of 5: 5 + 4 + 3 + 2 + 1 – Summation of 6: 6 + 5 + 4 + 3 + 2 + 1

  • What would a recursive implementation look

like? What’s the base case? Recursive case?

11

slide-12
SLIDE 12

www.umbc.edu

Summation Function

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

12

Base case: Don’t want to go below 0 Summation of 0 is 0 Recursive case: Otherwise, summation is num + summation(num-1)

slide-13
SLIDE 13

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) fact(0) fact(1) fact(2) fact(3) fact(4) main()

STACK

main() def main(): summ(4)

slide-14
SLIDE 14

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

STACK

main()

slide-15
SLIDE 15

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num = 4 num: 4

STACK

summ(4) main()

slide-16
SLIDE 16

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4 num = 4

This is a local variable. Each time the summ() function is called, the new instance gets its own unique local variables. STACK

summ(4) main()

slide-17
SLIDE 17

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3 num = 4

STACK

summ(3) summ(4) main()

slide-18
SLIDE 18

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

STACK

summ(2) summ(3) summ(4) main()

slide-19
SLIDE 19

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num = 1 num: 1

STACK

summ(2) summ(1) summ(3) summ(4) main()

slide-20
SLIDE 20

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 1 num = 0

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 0 num = 1

STACK

summ(2) summ(1) summ(0) summ(3) summ(4) main()

slide-21
SLIDE 21

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 1 num = 0

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 0 num = 1

STACK

summ(2) summ(1) summ(0) summ(3) summ(4) main()

slide-22
SLIDE 22

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 1 num = 0

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 0

return 0

return 0 num = 1

STACK

summ(2) summ(1) summ(0) summ(3) summ(4) main() POP!

slide-23
SLIDE 23

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 1

return 1 + 0 (= 1)

return 1 num = 1

STACK

summ(2) summ(1) summ(3) summ(4) main() POP! POP!

slide-24
SLIDE 24

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 2 num = 2 num = 4

return 2 + 1 (= 3)

return 3

STACK

summ(2) summ(3) summ(4) main() POP! POP! POP!

slide-25
SLIDE 25

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: return num + summ(num-1)

num: 3 num = 3 num = 4

return 3 + 3 (= 6)

return 6

STACK

summ(3) summ(4) main() POP! POP! POP! POP!

slide-26
SLIDE 26

www.umbc.edu

def summ(num): if num == 0: return 0 else: return num + summ(num-1) main() def main(): summ(4)

num: 4 num = 4

return 4 + 6 (=10)

return 10

STACK

summ(4) main() POP! POP! POP! POP! POP!

slide-27
SLIDE 27

www.umbc.edu

STACK

main() main() def main(): summ(4) POP! POP! POP!

return None

return None

POP! POP! POP!

slide-28
SLIDE 28

www.umbc.edu

STACK

POP! POP! POP!

return control

POP! POP! POP!

The stack is empty!

slide-29
SLIDE 29

www.umbc.edu

Returning and Recursion

slide-30
SLIDE 30

www.umbc.edu

Returning Values

  • If your goal is to return a final value

– Every recursive call must return a value – You must be able to pass it “back up” to main() – In most cases, the base case should return as well

  • Must pay attention to what happens at the

“end” of a function.

30

slide-31
SLIDE 31

www.umbc.edu

def summ(num): if num == 0: return 0 else: num + summ(num-1) main() def main(): summ(4)

num: 4

def summ(num): if num == 0: return 0 else: num + summ(num-1)

num: 3 num = 3

def summ(num): if num == 0: return 0 else: num + summ(num-1)

num: 2 num = 2 num = 4

def summ(num): if num == 0: return 0 else: num + summ(num-1)

num: 1 num = 0

def summ(num): if num == 0: return 0 else: num + summ(num-1)

num: 0 num = 1

Does this work? What’s wrong? STACK

summ(2) summ(1) summ(0) summ(3) summ(4) main()

slide-32
SLIDE 32

www.umbc.edu

Hailstone Example

slide-33
SLIDE 33

www.umbc.edu

The Hailstone Problem

  • Included as part of the

“Nested and While Loops” homework assignment

  • The problem is actually

known as the “Collatz Conjecture”

33

comic courtesy of xkcd.com

slide-34
SLIDE 34

www.umbc.edu

Rules of the Collatz Conjecture

  • Three rules to govern how it behaves

– If the current height is 1, quit the program – If the current height is even, cut it in half (divide by 2) – If the current height is odd, multiply it by 3, then add 1

  • This process has also been called HOTPO

– Half Or Triple Plus One

34

slide-35
SLIDE 35

www.umbc.edu

Implementation

  • In your homework, you implemented this

process using a while loop

  • Can you think of another way to implement it?
  • Recursively!

35

slide-36
SLIDE 36

www.umbc.edu

Designing our Recursive Function

  • What is our base case?

– When the Height is 1

  • What is our recursive case?

– We have two! What are they? – Height is even: divide by 2 – Height is odd: multiply by 3 and add 1

36

slide-37
SLIDE 37

www.umbc.edu

Exercise

  • Create a function hail() that takes in a

number and prints out the height of the hailstone at each point in time

  • Important considerations:

– What do we check first? Base or recursive case? – Is this function returning anything? Why or why not?

37

slide-38
SLIDE 38

www.umbc.edu

Exercise Details

  • Rules for function behavior

– If the current height is 1, quit the program – If the current height is even, cut it in half (divide by 2) – If the current height is odd, multiply it by 3, then add 1

  • Create a function hail() that

– Takes in a number – Prints out the height of the hailstone each time

38

slide-39
SLIDE 39

www.umbc.edu

Binary Search

slide-40
SLIDE 40

www.umbc.edu

Searching

  • Given a list of sorted elements (e.g., words),

find a specific word as quickly as possible

  • We could start from the beginning and iterate

through the list until we find it –But that could take a long time!

40

slide-41
SLIDE 41

www.umbc.edu

Binary Search

  • Uses a “divide and conquer” approach
  • Go to the middle, and compare the element

there to the one we’re looking for

– If it’s larger, we know it’s not in the last half – If it’s smaller, we know it’s not in the first half – If it’s the same, we found it!

41

slide-42
SLIDE 42

www.umbc.edu

Binary Search Example

42

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Find "J" A B C D E F G H I J K L M N O P Q R S T U V W X

slide-43
SLIDE 43

www.umbc.edu

Binary Search Example

43

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Find “V" A B C D E F G H I J K L M N O P Q R S T U V W X

slide-44
SLIDE 44

www.umbc.edu

Binary Search

  • Can be implemented using a while loop

– But much more common to use recursion

  • What is the base case?
  • What is the recursive case?

44

slide-45
SLIDE 45

www.umbc.edu

Recursion vs Iteration

slide-46
SLIDE 46

www.umbc.edu

Recursion and Iteration

  • Both are important

– All modern programming languages support them – Some problems are easy using one and difficult using the other

  • How do you decide which to use?

46

slide-47
SLIDE 47

www.umbc.edu

Use Iteration When…

  • Speed and efficiency is an issue
  • The problem is an obvious fit for iteration

– Processing every element of a list (or 2D list)

47

slide-48
SLIDE 48

www.umbc.edu

Use Recursion When…

  • Speed is not an issue
  • The data being processed is recursive

– A hierarchical data structure

  • A recursive algorithm is obvious
  • Clarity and simplicity of code is important

48

slide-49
SLIDE 49

www.umbc.edu

Fibonacci Sequences

slide-50
SLIDE 50

www.umbc.edu

Fibonacci Sequence

  • Number series
  • Starts with 0 or 1
  • Next number is found by adding the previous

two numbers together

  • Pattern is repeated over and over (and over…)

50

slide-51
SLIDE 51

www.umbc.edu

Fibonacci Sequence

  • Starts with 0, 1, 1
  • Next number is …?

51

5 1 1 2 3 8 13 21 34 55 89 144 233 377 610 … 987

slide-52
SLIDE 52

www.umbc.edu

Recursively Implement Fibonacci

  • The formula for a number in the sequence:

F(n) = F(n-1) + F(n-2)

  • What is our base case?
  • What is our recursive case?
  • How would we code this up?

52

slide-53
SLIDE 53

www.umbc.edu

Any Other Questions?

slide-54
SLIDE 54

www.umbc.edu

Announcements

  • Lab is back in session this week!

– Lab 11 is on classes

  • Project 1 is out

– Due by Tuesday, November 17th at 8:59:59 PM – Do NOT procrastinate!

  • Next Class: Dictionaries

54