Download presentation
Presentation is loading. Please wait.
Published byRuby Craig Modified over 9 years ago
1
1 Chapter 3. Recursion Lecture 6
3
In functions and data structures
5
5 What is recursion? ADS2 lecture 6 It is something defined in terms of itself … but it must have a stopping condition! … it must “bottom out”
7
7 Recursive functions A recursive function is one that calls itself. E.g. to calculate N! = N (N-1) (N-2) ... 1, do the following: if N = 0 then 1 else N (N-1)! We have defined the factorial function ! In terms of itself. –Note the factorial function is applied to a smaller number every time until it is applied to 0. ADS2 lecture 6
8
The factorial function in Java
9
fact(4) =
10
The factorial function in Java fact(4) = 4 * fact(3)
11
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2)
12
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
13
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1 * fact(0)
14
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1 * fact(0) = 4 * 3 * 2 * 1 * 1
15
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1 * fact(0) = 4 * 3 * 2 * 1 * 1 = 4 * 3 * 2 * 1
16
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1 * fact(0) = 4 * 3 * 2 * 1 * 1 = 4 * 3 * 2 * 1 = 4 * 3 * 2
17
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1 * fact(0) = 4 * 3 * 2 * 1 * 1 = 4 * 3 * 2 * 1 = 4 * 3 * 2 = 4 * 6
18
The factorial function in Java fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1 * fact(0) = 4 * 3 * 2 * 1 * 1 = 4 * 3 * 2 * 1 = 4 * 3 * 2 = 4 * 6 = 24
19
19 In general… A recursive function when calling itself makes a clone and calls the clone with appropriate parameters. Important: a workable recursive algorithm (function/procedure) must always: Rule 1: reduce size of data set, or the number its working on, each time it is recursively called and Rule 2: provide a stopping case (terminating condition) Can always replace recursive algorithm with an iterative one, but often recursive solution much sleeker Factorial function is only simple example, but recursion is valuable tool in more complex algorithms. ADS2 lecture 6
20
Linear recursion 20 With linear recursion a method is defined so that it makes at most one recursive call each time it is invoked. Useful when we view an algorithmic problem in terms of a first and/or last element plus a remaining set with same structure as original set. Example 1 : factorial example Example 2: summing the elements of an array - Algorithm LinearSum(A,n): Input: An integer array A and integer n 1, such that A has at least n elements Output:The sum of the first n integers in A if n=1 then return A[0] else return LinearSum(A,n-1)+A[n-1] This is pseudocode. Used in GoTa a lot. ADS2 lecture 6
21
21 Visualizing Recursion Recursion trace A box for each recursive call An arrow from each caller to callee An arrow from each callee to caller showing return value Example recursion trace: RecursiveFactorial(4) RecursiveFactorial(3) RecursiveFactorial(2) RecursiveFactorial(1) RecursiveFactorial(0) return1 call return1*1=1 2*1=2 3*2=6 4*6=24 final answer call ADS2 lecture 6 Actually we will remove the blue arrows on the right, to make it simpler
22
More examples
23
Raise m to the power n
24
We now have a recursive definition
25
Example 3: RaisePower Algorithm RaisePower(m,n): Input: Integers m,n Output: value of m n if n=0 then return 1 else return (m*RaisePower(m,n-1))
26
Example 3: RaisePower Algorithm RaisePower(m,n): Input: Integers m,n Output: value of m n if n=0 then return 1 else return (m*RaisePower(m,n-1)) Does RaisePower satisfy rules 1 and 2? Yes!
27
Example 3: RaisePower Algorithm RaisePower(m,n): Input: Integers m,n Output: value of m n if n=0 then return 1 else return (m*RaisePower(m,n-1)) Does RaisePower satisfy rules 1 and 2? Yes! Rule 1 (number function working on is decreased)
28
Example 3: RaisePower Algorithm RaisePower(m,n): Input: Integers m,n Output: value of m n if n=0 then return 1 else return (m*RaisePower(m,n-1)) Does RaisePower satisfy rules 1 and 2? Yes! Rule 1 (number function working on is decreased) Rule 2 ( stopping case)
29
ADS2 lecture 629 Recursion trace, m=2, n=4 RaisePower(2,4) return 1 return 2*1=2 return 2*8=16final answer call RaisePower(2,3) RaisePower(2,2) RaisePower(2,1) RaisePower(2,0) return 2*2=4 return 2*4=8
30
And in Java… 30 public static int raisePower(int m, int n){ if (n==0) return 1; else return(m*raisePower(m,n-1)); } ADS2 lecture 6
31
Another example … has9
32
has9 Given an integer (base 10) does it contain the digit 9?
33
33 Algorithm Has9(n): Input: Integer n Output: whether 9 appears in decimal expansion of n if (n mod 10)=9 then return true else if (n<10) then return false else return Has9(n/10) ADS2 lecture 6 has9
34
34 Does Has9 satisfy rules 1 and 2? Yes! Algorithm Has9(n): Input: Integer n Output: whether 9 appears in decimal expansion of n if (n mod 10)=9 then return true else if (n<10) then return false else return Has9(n/10) ADS2 lecture 6 has9
35
35 Does Has9 satisfy rules 1 and 2? Yes! Rule 1 (number function working on is decreased) Algorithm Has9(n): Input: Integer n Output: whether 9 appears in decimal expansion of n if (n mod 10)=9 then return true else if (n<10) then return false else return Has9(n/10) ADS2 lecture 6 has9
36
36 Does Has9 satisfy rules 1 and 2? Yes! Rule 1 (number function working on is decreased) Rule 2 ( stopping case) Algorithm Has9(n): Input: Integer n Output: whether 9 appears in decimal expansion of n if (n mod 10)=9 then return true else if (n<10) then return false else return Has9(n/10) ADS2 lecture 6 has9
37
37 Does Has9 satisfy rules 1 and 2? Yes! Rule 1 (number function working on is decreased) Rule 2 ( stopping case) Algorithm Has9(n): Input: Integer n Output: whether 9 appears in decimal expansion of n if (n mod 10)=9 then return true else if (n<10) then return false else return Has9(n/10) ADS2 lecture 6 has9
38
ADS2 lecture 638
39
ADS2 lecture 639 McCreesh & Prosser arXiv :1209.45601v1
40
ADS2 lecture 640
41
ADS2 lecture 641 Matula & Beck JACM 30(3) 1983
42
ADS2 lecture 642 Ostergard DAM 120 (2002)
43
ADS2 lecture 643 San Segundo C&OR 38 (2011)
44
ADS2 lecture 644 Fleiner, Irving & Manlove TCS 412 (2011)
45
ADS2 lecture 645
46
example reverse
47
Reverse an array
51
Example … for you palindrome
52
example Binary search
55
Note overloading
56
example All permutations of a string
57
perm
58
Ouch!
59
Arithmetic! (on natural numbers) example Similar to … Church Numerals
60
Recursive Arithmetic
64
example list
65
We have been defining lists in terms of nodes, where a node has - a head (we call it “element” where we store data) - a tail (we call it “next” and it points to the next node or null) This IS inherently recursive
66
list
70
NOTE: this is NOT destructive! It produces a new list!
71
Tail recursion Recursion is useful tool for designing algorithms with short, elegant definitions But comes at a cost – need to use memory to keep track of the state of each recursive call When memory is of primary concern, useful to be able to derive non-recursive algorithms from recursive ones. Can use a stack data structure to do this (see ADT chapter), but some cases we can do it more easily and efficiently i.e. when algorithms use tail recursion An algorithm uses tail recursion when recursion is linear and recursive call is its very last operation 71ADS2 lecture 6
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.