Discrete Mathematics: Logic Discrete Mathematics: Lecture 14. Recursive algorithm
recursive algorithms a n = a a a a a a a = a a n-1 power (a, n) = a power (a, n-1) basis step: if n = 0, power(a, 0) = 1, which is correct since a 0 = 1 inductive step: inductive hypothesis: power(a, k) = a k for all a 0 power(a, k+1) = a power(a, k) = a a k = a k+1
recursive algorithms power (a, n) = a power (a, n-1) procedure power (a: nonzero real number, n: nonnegative integer) if n = 0 then return 1 else return a power(a, n-1) {output is a n }
recursive algorithms an algorithm is recursive if it solves a problem by reducing it to an instance of the same problem with smaller input 0! = 1 n! = n (n-1)! n is positive integer 4! = 4 3! = 4 3 2! = 4 3 2 1! = 4 3 2 1 0! = 4 3 2 1 procedure factorial (n: nonnegtive integer) if n = 0 then return 1 else return n factorial(n-1) {output is n!}
recursive algorithms procedure factorial (n: nonnegtive integer) if n = 0 then return 1 else return n factorial(n-1) {output is n!}
recursive modular exponentiation b n mod m, where b, n, and m are integers with m 2, n 0, and 1 b < m b 0 mod m = 1 b n mod m = ( b b n-1 ) mod m = (b (b n-1 mod m)) mod m, n>0 procedure mpower (b, n, m) if n = 0 then return 1 else return b mpower(b, n-1, m)mod m
recursive modular exponentiation b n mod m, where b, n, and m are integers with m 2, n 0, and 1 b < m b n mod m = (b n/2 mod m) 2 mod m, n is even = ((b n/2 mod m) 2 mod m) (b mod m) mod m n is odd procedure mpower (b, n, m) if n = 0 then return 1 else if n is even then return mpower(b, n/2, m) 2 mod m else return ((mpower(b, n/2, m) 2 mod m) (b mod m) ) mod m
Fibonacci number 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...
Fibonacci number 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,... procedure iterative fibonacci(n: nonnegative integer) if n=0 then return 0 else x := 0 y := 1 for i :=1 to n-1 z := x + y x := y y := z return y { output is the nth Fibonacci number}
Fibonacci number fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) procedure fibonacci(n: nonnegative integer) if n=0 then return 0 else if n=1 then return 1 else return fibonacci(n-1) + fibonacci(n-2) {output is fibonacci(n)}
Fibonacci number fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) procedure fibonacci(n: nonnegative integer) if n=0 then return 0 else if n=1 then return 1 else return fibonacci(n-1) + fibonacci(n-2) {output is fibonacci(n)}
Fibonacci number procedure fastfibonacci(n: nonnegative integer) if n=0 return 0 return findfib(0,1,1,n) procedure findfib(a, b, m, n) if m=n return b return findfib(b, a+b, m+1, n) findfib(0, 1, 1, 4) return findfib(1,1, 2, 4) return findfib(1,2, 3, 4) return findfib(2, 3, 4, 4) return 3 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...
recursive Euclidean algorithm a = bq + r, a, b, q, r are integer gcd (a, b) = gcd (b, r), a > b gcd(8, 5)? 8 = 5 1 + 3 5 = 3 1 + 2 3 = 2 1 + 1 2 = 1 2 gcd(8, 5) = gcd(5, 3) = gcd(3,2) =1 procedure gcd (a, b: positive integer, a > b) if b = 0 then return a else return gcd (b, a mod b)
linear search procedure linear search(x: integer, a1, a2,..., an: integers) i := 1 while (i n and x ai) i := i + 1 if i n then location := i else location := 0 return location {location is the subscript of the term that equals x, or 0 if x is not found}
recursive linear search search (i, j, x): searches for the first occurrence of x in the sequence ai, ai+1,... aj. procudure search(i, j, x: integers, 1 i j n) if ai = x then return i else if i = j then return 0 else return search(i+1, j, x) {output is the location of x in a1, a2,... an if it appears; otherwise it is 0}
binary search procedure binary search(x: integer, a1, a2,..., an: integers in increasing order) i := 1 {i is left endpoint of search interval} j := n {j is right endpoint of search interval} while (i < j) m := (i + j)/2 if x > am then i := m + 1 else j := m if x = ai then location := i else location := 0 return location {location is the subscript i of the term ai equal to x, or 0 if x is not found}
recursive binary search procedure binary search(i, j, x: integers, 1 i j n) m := (i+j)/2 if x = am then return m else if (x < am and i < m) then return binary search(i, m-1, x) else if (x > am and j > m) then return binary search(m+1, j, x) else return 0 {i is the start output is the location of x in a1, a2,... an if it appears; otherwise it is 0}
merge sort procedure mergesort(l=a1,... an) if n > 1 then m := n/2 L1 := a1, a2,..., am L2 := am+1, am+2,...,an L := merge(mergesort(l1), mergesort(l2)) {L is now sorted into elements in nondecreasing order} procedure merge(l1, L2) L := empty list while L1 and L2 are nonempty remove smaller of first elements of L1 and L2 from its list put it at the right end of L if this removal makes one list empty then remove all elements from the other list and append them to L return L
merge sort 27 13 26 1 15 2 24 38 27 13 26 1 15 2 24 38 divide conquer 1 13 26 27 2 15 24 38 1 2 13 15 24 26 27 38
merge sort 27 13 26 1 15 2 24 38 1 11 2 27 13 26 1 15 2 24 38 6 divide 27 13 26 1 15 2 24 38 3 4 7 8 27 13 26 1 15 2 24 38 5 9 13 27 1 26 2 15 24 38 10 conquer 1 13 26 27 2 15 24 38 21 1 2 13 15 24 26 27 38