Presentation is loading. Please wait.

Presentation is loading. Please wait.

Introduction to Recursion

Similar presentations


Presentation on theme: "Introduction to Recursion"— Presentation transcript:

1 Introduction to Recursion
Lecture 6 Introduction to Recursion Please fasten your seat belts.

2 Whatintheheckisrecursion?
LB Whatintheheckisrecursion?

3 Solving a problem in terms of itself.
LB Solving a problem in terms of itself. wget Given a URL Read in the file Save it to disk Scan through file Find any JPG or GIF references then save them Find any HTML references then call wget

4 Solving a problem in terms of itself
LB Solving a problem in terms of itself ShowMe Given the name of a directory Read the directory Process each entry If an entry is a file then Print it on the screen Else // It’s a directory!!! ShowMe(the Entry)

5 Solving a problem in terms of itself
LB Solving a problem in terms of itself n! Is it: n * (n-1) * (n-2) * * 2 * 1 Or n * (n - 1)!

6 Solving a problem in terms of itself
LB Solving a problem in terms of itself 7! Is it: 7 * 6 * 5 * 4 * 3 * 2 * 1 Or 7 * 6!

7 Recursion Defined A procedure or function which calls itself.
Powerful mechanism for repetition. Makes algorithms more compact and simple. Module calls a “clone” of itself. Very useful, especially for dynamic data types.

8 Three Characteristics of Recursion
Calls itself recursively Has some terminating condition Moves “closer” to the terminating condition. Know this!!!

9 Two Flavors of Recursion
if (terminating condition) then do final actions else move one step closer to terminating condition call “clone” of module endif - or - if (NOT (terminating condition)) then

10 Everyday Example with Final Actions
procedure Pay_The_Bills() if (No_More_Bills_To_Pay) then Mail_The_Bills else Grab a bill Determine payment Write a check Place check in envelope Place stamp on envelope Pay_The_Bills() endif endprocedure //Pay_The_Bills

11 Everyday Example with No Final Actions
procedure Wash_The_Dishes() if (More_Dirty_Dishes) then Grab a dirty dish Wash it Put it in drainer Wash_The_Dishes() endif endprocedure //Wash_The_Dishes

12 Canonical Example LB function fact returnsa Num(N iot in Num)
// Don’t forget comments!!! if(N = 0) then fact returns 1 else fact returns N * fact(N - 1) endif endfunction // fact

13 A Recursive Procedure Problem: Count from N to 10.
procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen Call the procedure CountToTen (7)

14 ModuleID: Data values Unfinished business
Tracing The Recursion To keep track of recursive execution, do what a computer does: maintain information on an activation stack. Each stack frame contains: • Module identifier and variables • Any unfinished business ModuleID: Data values Unfinished business

15 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen CountToTen: count=7

16 7 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 CountToTen: count=7

17 7 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 CountToTen: count=7

18 7 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 CountToTen: count=8 CountToTen: count=7

19 7 8 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 CountToTen: count=8 CountToTen: count=7

20 7 8 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 CountToTen: count=8 CountToTen: count=7

21 7 8 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

22 7 8 9 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

23 7 8 9 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

24 7 8 9 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

25 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 10 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

26 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 10 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

27 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen CountToTen: count=11 7 8 9 10 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

28 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 10 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

29 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

30 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 10 CountToTen: count=8 CountToTen: count=7

31 7 8 9 10 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen 7 8 9 10 CountToTen: count=7

32 Return to the algorithm.
7 8 9 10

33 Reversing the Work and Recursion
Problem: Count from 10 to N. procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen Now the work will happen as the frames pop off the stack!

34 procedure CountToTen (count iot in Num)
if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=7

35 procedure CountToTen (count iot in Num)
if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=7

36 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=8 CountToTen: count=7

37 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=8 CountToTen: count=7

38 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

39 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

40 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

41 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

42 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen CountToTen: count=11 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

43 10 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

44 10 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 CountToTen: count=10 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

45 10 9 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 9 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

46 10 9 procedure CountToTen (count iot in Num) if (count <= 10) then
print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 9 CountToTen: count=9 CountToTen: count=8 CountToTen: count=7

47 10 9 8 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 9 8 CountToTen: count=8 CountToTen: count=7

48 10 9 8 procedure CountToTen (count iot in Num)
if (count <= 10) then print (count) // work CountToTen (count + 1) // recurse endif endprocedure //CountToTen procedure CountToTen (count iot in Num) if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 9 8 CountToTen: count=8 CountToTen: count=7

49 10 9 8 7 procedure CountToTen (count iot in Num)
if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 9 8 7 CountToTen: count=7

50 10 9 8 7 procedure CountToTen (count iot in Num)
if (count <= 10) then CountToTen (count + 1) // recurse print (count) // work endif endprocedure //CountToTen 10 9 8 7 CountToTen: count=7

51 Return to the algorithm.
10 9 8 7

52 Questions?

53


Download ppt "Introduction to Recursion"

Similar presentations


Ads by Google