Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Chapter 3. Recursion Lecture 6. In functions and data structures.

Similar presentations


Presentation on theme: "1 Chapter 3. Recursion Lecture 6. In functions and data structures."— Presentation transcript:

1 1 Chapter 3. Recursion Lecture 6

2

3 In functions and data structures

4

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”

6

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

48

49

50

51 Example … for you palindrome

52 example Binary search

53

54

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

61

62

63

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

67

68

69

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


Download ppt "1 Chapter 3. Recursion Lecture 6. In functions and data structures."

Similar presentations


Ads by Google