Download presentation
Presentation is loading. Please wait.
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?
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.