recursion - computer science at ubc

142
CPSC 259 Recursion Page 1 CPSC 259: Data Structures and Algorithms for Electrical Engineers Recursion Textbook References: (a) Etter (Third Edition): Chapter 4, pages 193-197 (b) Thareja: Chapter 2, pages 83-93 (c) Thareja (second edition): 7.7.4 Hassan Khosravi Borrowing some examples from Alan Hu and Steve Wolfman

Upload: others

Post on 25-Jan-2022

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 1

CPSC 259: Data Structures and Algorithms for Electrical Engineers

Recursion

Textbook References:

(a) Etter (Third Edition): Chapter 4, pages 193-197

(b) Thareja: Chapter 2, pages 83-93 (c) Thareja (second edition): 7.7.4

Hassan Khosravi Borrowing some examples from Alan Hu and Steve Wolfman

Page 2: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 2

Learning Goals •  design simple recursive functions. •  recognize algorithms as being iterative or recursive. •  describe how a computer runs recursive algorithms. •  demonstrate the ability to draw recursion trees. •  explain how stack overflow may arise as a result of

recursion. •  explain why a recursively defined method may take more

space than an equivalent iteratively defined method.

Page 3: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 3

Abstract Data Types

Data Structures

Stack Queue

Array Circular Array

Linked list

Tools

Asymptotic Analysis

CPSC 259 Journey

Recursion

Algorithms

Pointers

DynamicMemoryAlloca2on

Page 4: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 4

Function/Method Calls

•  A function or method call is an interruption or aside in the execution flow of a program:

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x>>=1

} return y; }

Page 5: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 5

Function Calls in Daily Life

•  How do you handle interruptions in daily life? –  You’re at home, working on CPSC259 project. –  You stop to look up something in the book. –  Your roommate/spouse/partner/parent/etc. asks for you

help moving some stuff. –  Your buddy calls. –  The doorbell rings.

•  You stop what you’re doing, you memorize where you were in your task, you handle the interruption, and then you go back to what you were doing.

LIFO! That’s a stack!

Page 6: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 6

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

Page 7: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 7

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 26

Page 8: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 8

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

Page 9: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 9

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 20lbs of steer manure to the garden.

Page 10: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 10

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

Page 11: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 11

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

I am listening to my buddy tell some inane story about last night.

Page 12: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 12

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

My buddy is just about to get to the point where he pukes…

Page 13: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 13

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

My buddy is just about to get to the point where he pukes…

I am signing for a FedEx package.

Page 14: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 14

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

My buddy is just about to get to the point where he pukes…

Page 15: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 15

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

My buddy has finally finished his story…

Page 16: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 16

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 40lbs of steer manure to the garden.

Page 17: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 17

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 60lbs of steer manure to the garden.

Page 18: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 18

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

I have moved 80lbs of steer manure to the garden.

Page 19: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 19

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 27

Page 20: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 20

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

I am reading about the delete function in Koffman p. 28

Page 21: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 21

Activation Records in Daily Life

I am working on line X of my stack.cpp file…

Page 22: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 22

Activation Records in Daily Life

I have finished my stack.cpp file! J

Page 23: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 23

Activation Records in Daily Life

Page 24: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 24

Activation Records on a Computer

•  A computer handles function/method calls in exactly the same way! (Also, “interrupts”)

Page 25: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 25

Activation Records on a Computer … int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 26: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 26

Activation Records on a Computer

a=?, b=?, c=?, d=?

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 27: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 27

Activation Records on a Computer

a=3, b=?, c=?, d=?

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 28: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 28

Activation Records on a Computer

a=3, b=6, c=?, d=?

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 29: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 29

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

Activation Records on a Computer

a=3, b=6, c=?, d=?

x=3,y=6

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 30: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 30

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

Activation Records on a Computer

a=3, b=6, c=?, d=?

x=1,y=7

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 31: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 31

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Activation Records on a Computer

a=3, b=6, c=?, d=?

x=0,y=8

Page 32: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 32

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Activation Records on a Computer

a=3, b=6, c=?, d=?

x=0,y=8

Page 33: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 33

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Activation Records on a Computer

a=3, b=6, c=?, d=?

return 8

Page 34: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 34

Activation Records on a Computer

a=3, b=6, c=8, d=?

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 35: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 35

Activation Records on a Computer

a=3, b=6, c=8, d=9

… int a, b, c, d; a = 3; b = 6; c = foo(a,b); d = 9; …

int foo(int x, int y) { while (x>0) {

y++; x >>= 1;

} return y; }

Page 36: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 36

Recursion is handled the same way!

n=4

Page 37: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 37

Recursion is handled the same way!

n=4

Page 38: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 38

Recursion is handled the same way!

n=4

Page 39: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 39

Recursion is handled the same way!

n=4

n=3

Page 40: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 40

Recursion is handled the same way!

n=4

n=3

Page 41: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 41

Recursion is handled the same way!

n=4

n=3

Page 42: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 42

Recursion is handled the same way!

n=4

n=3

n=2

Page 43: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 43

Recursion is handled the same way!

n=4

n=3

n=2

Page 44: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 44

Recursion is handled the same way!

n=4

n=3

return 1

Page 45: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 45

Recursion is handled the same way!

n=4

n=3, result=1+…

Page 46: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 46

Recursion is handled the same way!

n=4

n=3, result=1+…

n=1

Page 47: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 47

Recursion is handled the same way!

n=4

n=3, result=1+…

return 1

Page 48: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 48

Recursion is handled the same way!

n=4

n=3, result=1+1

Page 49: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 49

Recursion is handled the same way!

n=4

return 2

Page 50: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 50

Recursion is handled the same way!

n=4, result=2+…

Page 51: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 51

Recursion is handled the same way!

n=4, result=2+…

Page 52: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 52

Recursion is handled the same way!

n=4, result=2+…

n=2

Page 53: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 53

Recursion is handled the same way!

n=4, result=2+…

n=2

Page 54: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 54

Recursion is handled the same way!

n=4, result=2+…

return 1

Page 55: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 55

Recursion is handled the same way!

n=4, result=2+1

Page 56: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 56

Recursion is handled the same way!

return 3

Page 57: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 57

Recursion is handled the same way!

As I said before, do NOT try to think about recursion this way!

Page 58: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 58

Thinking Recursively (Open a Present ) Problem: Your friends have given you a watch as a birthday present. To prolong the suspense when opening the present, they have wrapped it in several layers of gift-wrapping. Write an algorithm to open the present.

Open-Present(P)ifyoucanseetheactualgi<Say''Thankyou''elseOpentheboxOpen-Present(contentsofbox)

Page 59: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 59

Designing Recursive Functions (review) •  When designing recursive functions:

–  Don’t start with code. Instead, write the story of the problem, in natural language.

–  As soon as you break the problem down in terms of any simpler version, call the function recursively and assume it works. Do not think about how!

Whenlearningtodriveacartherearetwoformsofknowledge:

(1) knowinghowtooperateacar.(2) knowinghowthecaroperates.

Naturallyonecanbeaverygooddriverwithouthavingmuchknowledgeofhowacaritselfoperates.

Page 60: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 60

Designing Recursive Functions

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller

versions of itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

ifsmallenoughtobesolveddirectly:solveit.else(1)recursivelyapplythealgorithmtooneormoresmallerinstances.(2)usethesolu2on(s)fromsmallerinstancestosolvetheproblem.

Page 61: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 61

Factorial example •  Consider the following example

–  n! = n* (n-1) * (n-2)….*1 –  5! = 5 * 4 * 3 * 2 * 1 –  4! = 4 * 3 * 2 * 1 –  5! = 5 * 4! –  0! = 1

•  More generally n! = {

1  forn=0n*(n-1)!forn>0

Page 62: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 62

Designing Recursive Functions

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller

versions of itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

int factorial(int n){ ! if(n==0) ! return 1; ! else! return (n * factorial(n - 1)); !}

Page 63: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 63

Factorial example

int factorial(int n) !{ ! if(n==0) ! return 1; ! else! return (n * factorial(n - 1)); !}

-->

factorial(0)

--> -->

-->

factorial(1)

-->

-->

-->

--> -->

int factorial(int n) !{ ! if(n==0) ! return 1; ! else! return(n * factorial(n-1)); !}

int factorial(int n) !{ ! if(n==0) ! return 1; ! else! return(n * factorial(n-1)); !}

Page 64: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 64

Factorial example- Work flow

factorial(0)

factorial(1) n=1Return1*factorial(0)

n=0Return1

Return 1

1

1

factorial(2) n=2Return2*factorial(1)

Call factorial(1) Return 1

2

factorial(3) n=3

Return3*factorial(2)

Return 2

6

Page 65: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 65

Recursion Tree int factorial(int n){ ! ! if (n == 0) ! return 1; ! ! else! return n * factorial(n-1); !} !

factorial(4)

factorial(4)

factorial(3)

factorial(2)

factorial(1)

factorial(0)

Page 66: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 66

Palindrome Example •  Create a recursive function that determines whether or not

a word is a palindrome. A palindrome is a word or sentence that reads the same forward as it does backward.

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

int is_palindrome(char * str, int length); !

Page 67: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 67

Palindrome Example int is_palindrome(char * str, int length){ !

if (length <= 1) !return 1; !

! /* to be added */ !!!}

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

Page 68: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 68

Palindrome Example int is_palindrome(char * str, int length){ !

if (length <= 1) !return 1; !

! /* is_palindrome(str + 1, length - 2) */ !!}

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

Page 69: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 69

Palindrome Example int is_palindrome(char * str, int length){ !

if (length <= 1) !return 1; !

!else!

return (str[0] == str[length - 1]) && ! is_palindrome(str + 1, length - 2); !}

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

Page 70: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 70

Finding max example •  Using recursion, find the largest element in an array of

integer values. int maxRecurse(int nums[], int n); !

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

Page 71: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 71

Finding max example

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

int maxRecurse(int nums[], int n){ ! if (n== 1) ! return nums[0]; !! /* to be added */ !}

Page 72: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 72

Finding max example

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

int maxRecurse(int nums[], int n){ ! if (n== 1) ! return nums[0]; !! /* maxRecurse(nums, n-1) */ !}

Page 73: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 73

Finding max example

1.  Recognize the base case(s) and provide solution(s). 2.  Devise a strategy to split the problem into smaller versions of

itself. Smaller versions must make progress towards the base case.

3.  Without thinking about how the smaller version is computed, figure out how you can use it to solve the original problem we started off with.

int maxRecurse(int nums[], int n){ ! if (n== 1) ! return nums[0]; !! return max(maxRecurse(nums, n-1), nums[n-1]); !}

Page 74: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 74

Cargo-Bot Cool Free Game that Uses Recursion on iPad

•  Gameplay centers on a crane that moves and stacks a set of colored crates.

•  Players write small visual programs to move the crates from an initial configuration to a goal configuration.

•  The set of available instructions is quite small.

•  recursion is the only mechanism for repetition.

Page 75: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 75

•  We need to be very careful when writing recursive algorithms. What would happen in the following programs?

•  Recursive calls to sub-problems must converge towards the base case(s). –  Each call must bring the values in use closer to the halting

conditions.

Infinite Recursion

int factorial(int n){ ! ! if (n == 0) ! return 1; ! ! else! return n * factorial(n-1); !} !

n < 0

Page 76: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 76

Stack Overflow factorial(1000000)

factorial(1000000)

factorial(999999)

factorial(999998)

factorial(999997)

factorial(999996)

int factorial(int n){ ! ! if (n == 0) ! return 1; ! ! else! return n * factorial(n-1); !} !

Page 77: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 77

Thinking Recursively (Eat a Chocolate Bar) Problem: You have a chocolate bar with nuts. Eat just the squares that have nuts in them. Write a recursive algorithm to solve the problem.

EatChocolateBar(B)ifBisasinglesquarethenifBhasanutthenEatitelseBreakthebarintotwopiecesEatChocolateBar(Piece1)EatChocolateBar(Piece2)

Page 78: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 78

Thinking Recursively (Eat a Chocolate Bar)

EatChocolateBar(B)ifBisasinglesquarethenifBhasanutthenEatitelseBreakthebarintotwopiecesEatChocolateBar(Piece1)EatChocolateBar(Piece2)

Page 79: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 79

The Fibonacci Numbers •  The Fibonacci numbers are the numbers in the sequence: •  1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … •  The first two numbers are 1, and then each succeeding

number can be generated by adding together the previous two numbers in the sequence. This leads to the following recursive definition:

int fib(int n){ ! if (n==1) ! return 1; ! else if(n==2) ! return 1; ! else! return fib(n-1) + fib(n-2); !} !

Page 80: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 80

fib(4)

fib(3) fib(2)

fib(2) fib(1)

1 1

2 1

int fib(int n){ if (n==1) return 1; else if (n==2) return 1; else return fib(n-1) + fib(n-2); }

à

à

à

à

n=4 int fib(int n){ if (n==1) return 1; else if (n==2) return 1; else return fib(n-1) + fib(n-2); }

à

à

à

à

n=3 int fib(int n){ if (n==1) return 1; else if (n==2) return 1; else return fib(n-1) + fib(n-2); }

à

à

à

n=2

int fib(int n){ if (n==1) return 1; else if (n==2) return 1; else return fib(n-1) + fib(n-2); }

àà

n=1 int fib(int n){ if (n==1) return 1; else if (n==2) return 1; else return fib(n-1) + fib(n-2); }

à

àà

n=2

Page 81: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 81

Fractals worksheet fancyTri (0, 0, 100); fancySquare (0, 0, 100);

Where the size of the biggest triangle or square is smaller than 10

Page 82: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 82

Triangle function /* ! * Purpose: draws a right-angled, isosceles triangle on the screen. ! * The top left corner of the screen is mapped to (0,0). ! * Param: int x – x-coordinate of the upper vertex ! * Param: int y – y-coordinate of the upper vertex ! * Param: int size – length of the equal/ shorter sides ! */!void triangle(int x, int y, int size); !

triangle(2, 5, 5);

5

10

2 7 triangle(1, 1, 2);

1

3

1 3

Page 83: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 83

simpleTri(x1, y1, n) /* ! * Purpose: draws a simple picture using triangles as ! * illustrated. ! * Param: int x – x-coordinate of the upper vertex ! * Param: int y – y-coordinate of the upper vertex ! * Param: int size – size of the bigger triangle ! */!void simpleTri(int x, int y, int size){ ! triangle (x, y, size/2); ! triangle(x, y+size/2, size/2); ! triangle(x+size/2, y+size/2, size/2); !}

y1

y1+n/2

y1 +n

x1 x1+n/2 x1+n

Page 84: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 84

How is fancyTri constructed? /* ! * Purpose: draws a fancy picture using triangles ! * as illustrated in the Fractals worksheet ! * Param: int x – x-coordinate of the upper vertex ! * Param: int y – y-coordinate of the upper vertex ! * Param: int size – size of the bigger triangle ! */!void fancyTri(int x, int y, int size){ ! if(size<10) ! triangle (x, y, size); ! else{ ! fancyTri(x, y, size/2); ! fancyTri(x, y+size/2, size/2); ! fancyTri(x+size/2, y+size/2, size/2); ! } !}

Page 85: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 85

Clicker question •  How many nodes does the recursion tree of fancyTri(0,0,20)have?

A: 4

B: 5

C: 12

D: 13

E: 21

/* ! * Purpose: draws a fancy picture using triangles ! * as illustrated in the Fractals worksheet ! * Param: int x – x-coordinate of the upper vertex ! * Param: int y – y-coordinate of the upper vertex ! * Param: int size – size of the bigger triangle ! */!void fancyTri(int x, int y, int size){ ! if(size<10) ! triangle (x, y, size); ! else{ ! fancyTri(x, y, size/2); ! fancyTri(x, y+size/2, size/2); ! fancyTri(x+size/2, y+size/2, size/2); ! } !}

Page 86: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 86

Clicker question (answer) void fancyTri(int x, int y, int size){ ! if(size<10) ! triangle (x, y, size); ! else{ ! fancyTri(x, y, size/2); ! fancyTri(x, y+size/2, size/2); ! fancyTri(x+size/2, y+size/2, size/2); ! } !}

fT(0,0,20)

fT(0,0,10)

fT(0,0,5)

fT(0,5,5)

fT(5,5,5)

fT(0,10,10)

fT(0,10,5)

fT(0,15,5)

fT(5,15,5)

fT(10,10,10)

fT(10,10,5)

fT(10,15,5)

fT(15,15,5)

Page 87: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 87

Clicker question (answer) void fancyTri(int x, int y, int size){ ! if(size<10) ! triangle (x, y, size); ! else{ ! fancyTri(x, y, size/2); ! fancyTri(x, y+size/2, size/2); ! fancyTri(x+size/2, y+size/2, size/2); ! } !}

fT(0,0,20)

fT(0,0,10)

fT(0,0,5)

fT(0,5,5)

fT(5,5,5)

fT(0,10,10)

fT(0,10,5)

fT(0,15,5)

fT(5,15,5)

fT(10,10,10)

fT(10,10,5)

fT(10,15,5)

fT(15,15,5)

D: 13

Page 88: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 88

Can We Write Factorial Iteratively? Recursive Iterative

int factorial_iterative(int n){ ! int factorial=1; !! for (int i = 1; i <= n; i++) ! factorial = factorial * i; !! return factorial; !}

int factorial(int n){ ! ! if (n == 0) ! return 1; ! ! else! return n * ! factorial(n-1); !}

Page 89: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 89

Can We Write Fibonacci Iteratively? Recursive Iterative

int fib_iterative(int n) { ! int answer=1; ! int answerminus1 = 1; ! int answerminus2 = 1; ! for (int i = 3; i <= n; i++) { ! answer = answerminus1 + ! answerminus2; ! answerminus2 = answerminus1; ! answerminus1 = answer; ! } ! return answer; !}

int fib(int n){ ! if (n==1) ! return 1; !! else if(n==2) ! return 1; !! else! return fib(n-1) ! + fib(n-2); !}

Page 90: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 90

Which One is Better? Recursive Iterative

int factorial_iterative(int n){ ! int factorial=1; !! for (int i = 1; i <= n; i++) ! factorial = factorial * i; !! return factorial; !}

int factorial(int n){ ! ! if (n == 0) ! return 1; ! ! else! return n * ! factorial(n-1); !}

A:TherecursiveversionB:Theitera2veversionC:ThetwoareasgoodaseachotherD:Noneoftheabove

Page 91: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 91

Appreciating Recursion •  Random String Permutations

– Problem: Permute a string so that every reordering of the string is equally likely. You may use a function randrange(n), which selects a number [0,n) uniformly at random.

Page 92: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 92

Random String Permutations Understanding the Problem

•  A string is: –  an empty string or a letter plus the rest of the string.

•  We want every letter to have an equal chance to end up first. We want all permutations of the rest of the string to be equally likely to go after.

•  And.. there’s only one empty string.

Page 93: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 93

Random String Permutations Algorithm

PERMUTE(s): if s is empty, just return s else: use randRange to choose a random first letter permute the rest of the string (minus that random letter) return a string that starts with the random letter and continues with the permuted rest of the string

Page 94: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 94

Conver2ngAlgorithmtoPsudocode

PERMUTE(s): if s is empty, just return s else: choose random letter permute the rest return random letter + rest

Page 95: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 95

Appreciating Recursion Even More •  Let’s study a more complex example that would be

challenging to solve without recursion.

•  Problem: Design a method that prints out all permutations of a string that does not contain repeated characters. –  A permutation is simply a rearrangement of the letters in the

string. –  For example, the string "abc" has six permutations.

abc bac cab acb bca cba

Page 96: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 96

Find the Base Case(s) •  What would be the simplest string(s)?

–  The empty string has a single permutation: itself

permutations(s): if s is empty: just return s

Page 97: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 97

Simplify the Problem •  Suppose the input is "abc"

– How can we generate all permutations that start with the letter 'a'?

– Would assuming that I have all permutations of "bc" help?

– How can we generate all permutations that start with the

letter 'b'? – Would assuming that I have all permutations of "ac"

help?

bccb

abcacb

acca

bacbca

Page 98: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 98

Write Algorithm (in English) permutations(s): if s is empty: just return s else:

– loop through all character positions •  form a shorter word by removing the ith char • generate all permutations of the simpler word • add the removed character to the front of each

permutation of the simpler word – return all permutations

Page 99: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 99

Test Your Algorithm s = "abc" loop through all character positions: a

loop through all character positions: b loop through all character positions: c

bcbccb

abcacb

acacca

bacbca

ababba

cabcba

abcacbbacbcacabcba

Page 100: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 100

Classic Problems that can be Solved Recursively (Fractals)

Sierpinskitriangle KochCurve

Page 101: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 101

Classic Problems that can be Solved Recursively (Sorting)

3 -4 7 5 9 6 2 1

3 -4 7 5 9 6 2 1

-4 3 5 7 1 2 6 9

-4 1 2 3 5 6 7 9

mergesort(array) if size == 1 return else mergesort(leftHalf) mergesort(rightHalf) merge(leftHalf, rightHalf)

…………

Page 102: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 102

Classic Problems that can be Solved Recursively (Sorting)

3 -4 7 5 9 6 2 1

3 -4 7 5 9 6 2 1

3 -4 7 5 9 6 2 1

3 -4 7 5 9 6 2 1

-4 3 5 7 6 9 1 2

-4 3 5 7 1 2 6 9

-4 1 2 3 5 6 7 9

mergesort(array) if size == 1 return else mergesort(leftHalf) mergesort(rightHalf) merge(leftHalf, rightHalf)

Page 103: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 103

Classic Problems that can be Solved Recursively (Backtracking)

Maze Sudoku

Source:WikipediahYp://en.wikipedia.org/wiki/Backtracking

Source:WikipediahYp://en.wikipedia.org/wiki/Maze

Page 104: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 104

Classic Problems that can be Solved Recursively (operations on data structures)

Source:Flickr,labeledfornoncommercialreuse

Page 105: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 105

Challenging Activity •  Problem: Try to write code that prints out all permutations

of a string using iteration.

Page 106: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 106

Which One is More Powerful?

•  Iteration and recursion are equally powerful and can solve the same problems. •  Simulating iteration with recursion is easy.

int i = 0; !while (i < n){ ! doFoo(i); ! i++; !}

void recDoFoo(int i, int n){ ! if (i >= n) ! return; ! ! else{ ! doFoo(i); ! recDoFoo(i + 1, n); ! } !} !

recDoFoo(0, n);

Page 107: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 107

Which One is More Powerful?

•  Iteration and recursion are equally powerful and can solve the same problems. •  Simulating recursion with iteration is harder and

beyond the scope of this course

•  But here is the general idea – Simulate the call stack by creating a stack

yourself. – This can be tricky, so it is better to let the

computer do this for you.

Page 108: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 108

Iterative vs. Recursive Approaches

– Use iteration when •  runtime is extremely important (even small differences) •  your algorithm doesn’t use a lot of extra space and

you’re happy with the runtime.

– Use recursion since •  recursive programs can be relatively simpler to write,

analyze, and understand than iterative versions. •  recursive programs can benefit from the call stack in

more complex problems that run slower and/or require more space.

Page 109: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 109

Be Very Careful When You Use Recursion •  Poorly designed recursive procedures can use a lot

of memory and be very slow. •  It is is much easier to shoot yourself in the foot without

noticing when you use recursion.

Page 110: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 110

Can We Write Fibonacci Iteratively? Recursive

int fib(int n){ ! if (n==1) ! return 1; ! else if(n==2) ! return 1; ! else! return fib(n-1) + ! fib(n-2); !}

Iterative int fib_iterative(int n) { ! int answer=1; ! int answerminus1 = 1; ! int answerminus2 = 1; ! for (int i = 3; i <= n; i++) { ! answer = answerminus1 + ! answerminus2; ! answerminus2 = answerminus1; ! answerminus1 = answer; ! } ! return answer; !}

Let’srunthem

Page 111: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 111

Runtime Comparison of Different Fibonacci Implementations (in seconds)

30 32 34 36 38 40 42 44 Plain,

recursive 0.19 0.5 1.37 3.6 9 25 64 166

Iterative 0.0004 0.00048 0.00051 0.00052 0.00055 0.00059 0.00062 0.00065

0

50

100

150

200

30 32 34 36 38 40 42 44

Time(secon

ds)

input

Plain,recursive

Itera2ve

Page 112: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 112

Recursion and efficiency •  Each function invocation generates an activation record that holds

the values of arguments and local variables for that invocation. These activation records are stored in an area of memory called the run-time stack. The diagram below shows the state of the run-time stack when a call to fib(4) is made from main.

•  The height of fib’s recursion tree plus 1 is the maximum number of fib activation records on the run-time stack at any given time—in this case 3. Memory for the runtime stack is limited. If we attempt to generate more activation records than can be stored on the run-time stack, a stack overflow occurs and the program will crash.

mainfib(4)main

fib(3)fib(4)main

fib(2)fib(3)fib(4)main

fib(3)fib(4)main

fib(1)fib(3)fib(4)main

fib(3)fib(4)main

fib(4)main

fib(2)fib(4)main

fib(4)main main

Page 113: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 113

Plain Recursive Fibonacci

0 1 2 3 4 5 6 7 8 9

10

Spac

e Stack space used in computing fib(10)

Page 114: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 114

Plain Recursive Fibonacci Stack space used in computing fib(15)

0

2

4

6

8

10

12

14

16

Spac

e

Page 115: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 115

CPSC 259 Administrative Notes •  Starting Lab 4 – Week 1 on Monday

•  Midterm Friday, Nov 13

•  Unfortunately, we’ve had a few plagiarism cases that I’m following up on. –  Course policy on plagiarism is stated on the course website

Page 116: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 116

Thank you for your feedback •  Great to know that most people like how the course is

progressing. – Average response to “Overall, the instructor was an effective

teacher” was ~4.8

•  Some common dislikes –  8 am lectures! – Textbook

• Any recommendations? •  Stanford's tutorial notes for C programming.

– Quizzes – Midterm was a bit long

Page 117: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 117

Redundant Computation •  Do we really need to compute fib(3) multiple times?

fib(6)

fib(5)

fib(4) fib(3)

fib(3) fib(2)

fib(2) fib(1)

fib(2) fib(1)

fib(4)

fib(3) fib(2)

fib(2) fib(1)

(1) Redundant computation (2) Requires a lot of memory

Can we do better?

Page 118: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 118

Be Very Careful When You Use Recursion •  Poorly designed recursive procedures can use a lot of memory and

be very slow. •  It is is much easier to shoot yourself in the foot without noticing when you use

recursion.

•  Well designed recursive procedures are almost (constant factor difference) as fast as iterative procedures

•  Memoization can make recursive functions run faster.

Page 119: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 119

Recursion -- Memoization •  Memoization

–  After computing a solution, store it in a table before returning. (Leave a “memo” to yourself.)

–  At start of the function, check if you’ve solved this case before. If so, return the already calculated solution.

fib(6)

fib(5)

fib(4) fib(3)

fib(3) fib(2)

fib(2) fib(1)

fib(2) fib(1)

fib(4)

fib(3) fib(2)

fib(2) fib(1)

fib(6)

fib(5)

fib(4)

fib(3)

fib(2) fib(1)

fib(2)

fib(3)

fib(4)

n Fn6

5

4

3

2

11

1

2

3

5

8

Page 120: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 120

Recursion -- Memoization •  Memoization

–  After computing a solution, store it in a table before returning. (Leave a “memo” to yourself.)

–  At start of the function, check if you’ve solved this case before. If so, return the already calculated solution.

fib(6)

fib(5)

fib(4) fib(3)

fib(3) fib(2)

fib(2) fib(1)

fib(2) fib(1)

fib(4)

fib(3) fib(2)

fib(2) fib(1)

fib(6)

fib(5)

fib(4)

fib(3)

fib(2) fib(1)

fib(2)

fib(3)

fib(4)

n Fn6

5

4

3

2

11

1

2

3

5

8

Page 121: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 121

Memoizing Fib int fibMem(int n) !{ ! int* fibTable = (int*) calloc(sizeof(int) , MAX); ! return fibMemoHelper(n, fibTable); ! !}

int fibMemoHelper(int n, int fibTable[]) !{ ! if (n==1) ! fibTable[1] = 1; ! else if (n==2) ! fibTable[2] = 1; ! else if (fibTable[n]==0) ! fibTable[n] = fibMemoHelper(n-1, fibTable)+ ! fibMemoHelper(n-2, fibTable); ! ! return fibTable[n]; !}

Page 122: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 122

Runtime Comparison of Different Fibonacci Implementations (in seconds)

30 32 34 36 38 40 42 44 Plain, recursive 0.19 0.5 1.37 3.6 9 25 64 166

Memoized 0.0005 0.0005 0.00051 0.00053 0.00055 0.0006 0.0006 0.0006 Iterative 0.0004 0.00048 0.00051 0.00052 0.00055 0.00059 0.00059 0.00059

0

50

100

150

200

30 32 34 36 38 40 42 44

Time(secon

ds)

input

Plain,recursive

Memoized

Itera2ve

Page 123: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 123

Runtime Comparison -- a Closer Look (1) (in seconds)

10 100 1,000 10,000 Memoized 0.00041 0.0009 0.001 0.013 Iterative 0.0003 0.0004 0.0009 0.0082

00.0020.0040.0060.0080.010.0120.014

10 100 1,000 10,000

Time(secon

ds)

input

Memoized

Itera2ve

Page 124: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 124

Clicker Question •  factorial_memoized(100)is expected to run _____

than factorial_plain_recursive(100)? •  A: significantly faster B: slightly faster C: slightly slower D: significantly slower E: none of the above

Page 125: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 125

Clicker Question (answer) •  factorial_memoized(100)is expected to run _____

than factorial_plain_recursive(100)? •  A: significantly faster B: slightly faster C: slightly slower D: significantly slower E: none of the above

Page 126: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 126

Runtime Comparison -- a Closer Look (2) (in seconds)

10 100 1,000 10,000 100,000 Memoized 0.00041 0.0009 0.001 0.013 Crashed Iterative 0.0003 0.0004 0.0009 0.0082 0.048

0

0.01

0.02

0.03

0.04

0.05

0.06

10 100 1,000 10,000 100,000

Time(secon

ds)

input

Memoized

Itera2ve

Page 127: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 127

Memoized Fibonacci

Stackspaceusedincompu2ngfib_memoized(10)

0 1 2 3 4 5 6 7 8 9

10

0 5 10 15 20 25 30 35 40

Spac

e

Time

Page 128: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 128

Memoized Fibonacci Stackspaceusedincompu2ngfib_memoized(40)

0

5

10

15

20

25

30

35

40

45

0 20 40 60 80 100 120 140 160 180

Spac

e

Time (1) Redundant computation (2) Requires a lot of memory

Page 129: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 129

Be Very Careful When You Use Recursion •  Poorly designed recursive procedures can use a lot of memory and

be very slow. •  It is is much easier to shoot yourself in the foot without noticing when you use

recursion.

•  Well designed recursive procedures can use almost (constant factor difference) the same amount of memory as iterative procedures:

•  Tail recursion can make recursive functions use less space.

Page 130: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 130

Clicker Question

•  What do you think would happen if you execute this function?

A: This will result in a stack overflow B: This will magically not result in a stack overflow C: It depends D: None of the above

void endlesslyGreet(){ ! printf("Hello World! \n"); ! endlesslyGreet(); !}

Page 131: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 131

Tail Recursion •  A function is “tail recursive” if for every recursive call in

the function, that call is the absolute last thing the function needs to do before returning.

•  In that case, why bother pushing a new stack frame? There’s nothing to remember. Just re-use the old frame.

•  That’s what most compilers will do.

Page 132: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 132

Compare and Contrast

void countinglyGreet(int n){ ! ! if (n <=1) ! return; ! ! printf("Hello! \n"); ! countinglyGreet(n-1); !}

int factorial(int n){ ! ! if (n <=1) ! return 1; !! else! return n * factorial(n-1); !}

•  How are these two functions –  Similar? –  Different?

countinglyGreet(4); factorial(4);

Page 133: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 133

Compare and Contrast countinglyGreet(4); factorial(4);

factorial(4)

factorial(3)

factorial(2)

factorial(1)

countinglyGreet(4)

countinglyGreet(3)

countinglyGreet(2)

countinglyGreet(1)

Needstowaitforfactorial(3)

Doesnotneedtowaitforcoun2nglyGreet(3)

Page 134: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 134

Managing the Call Stack: Tail Recursion •  This is clearly infinite recursion. The call stack will get

as deep as it can get and then stack overflow, right? void endlesslyGreet(){ !

cout << "Hello, world!" << endl; ! endlesslyGreet(); !} !

Sinceatailcalldoesn’tneedtogenerateanewac2va2onrecordonthestack,agoodcompilerwon’tmakethecomputerdothat.Therefore,tailcalldoesn’tincreasedepthofcallstack.

Page 135: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 135

Tail Recursive?

Is this function tail recursive? a. Yes. b. No. c. Not enough information.

int factorial (int n) { ! if (n == 0) return 1; ! else return n * factorial(n – 1); !} !

Page 136: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 136

Tail Recursive?

Is this function tail recursive? a. Yes. b. No. c. Not enough information.

int factorial (int n) { ! if (n == 0) return 1; ! else return n * factorial(n – 1); !} !

Page 137: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 137

Tail Recursive Factorial int factorial_tailrecursive(int n) !{ ! int result = factorial_tailrecursive_helper(n, 1); ! return result; !}

int factorial_tailrecursive_helper(int n, int acc) !{ ! if (n ==0) ! return acc; ! ! return factorial_tailrecursive_helper(n-1, acc*n); !}

Page 138: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 138

Factorial

factorial(4)

factorial(3)

factorial(2)

factorial(1)

factorial(0)

6

1

2

1

24

factorial_tail(4,1)

factorial_tail(3,4)

factorial_tail(2,12)

factorial_tail(1,24)

factorial_tail(0 ,24)

24

Page 139: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 139

Tail Recursive Fibonacci

int fib_tailRecursive(int n, int next, int result) { ! if (n==1) ! return result; ! ! else{ ! return fib_tailRecursive(n-1, result+next, next); ! ! }

!return fib_tailRecursive(n, 1, 1); !

Page 140: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 140

Runtime Comparison (in seconds) fib_tailRecursive vs. fib_iterative

0

0.02

0.04

0.06

0.08

0.1

10 100 1,000 10,000 100,000

Time(secon

ds)

Input

Tail_recursive

Itera2ve

10 100 1,000 10,000 100,000 Tail_recursive 0.00038 0.0005 0.0012 0.0093 0.078

Iterative 0.0003 0.0004 0.0009 0.0082 0.048

Page 141: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 141

Recursion vs. Iteration –  Iteration and recursion are equally powerful

problem solving techniques. •  recursive programs can be relatively simpler to write,

analyze, and understand than iterative versions. •  recursive programs can benefit from the call stack in

more complex problems that run slower and/or require more space.

– Recursion may carry around a bit more (a constant factor more) memory than iteration but if well designed, neither is more efficient.

Page 142: Recursion - Computer Science at UBC

CPSC 259 Recursion Page 142

Learning Goals revisited •  design simple recursive functions. •  recognize algorithms as being iterative or recursive. •  describe how a computer runs recursive algorithms. •  demonstrate the ability to draw recursion trees. •  explain how stack overflow may arise as a result of

recursion. •  explain why a recursively defined method may take more

space than an equivalent iteratively defined method.