300 likes | 439 Views
ITI 1120 Lab #8. Contributors: Diana Inkpen, Daniel Amyot, Sylvia Boyd, Amy Felty, Romelia Plesa, Alan Williams. Lab 8 Agenda. Recursion Examples of recursive algorithms Recursive Java methods. Recursion Practice problem #1.
E N D
ITI 1120Lab #8 Contributors: Diana Inkpen, Daniel Amyot, Sylvia Boyd, Amy Felty, Romelia Plesa, Alan Williams
Lab 8 Agenda • Recursion • Examples of recursive algorithms • Recursive Java methods
Recursion Practice problem #1 • Write a recursive algorithm for counting the number of digits in a non-negative integer, N
Practice problem #1- solution GIVENS: N INTERMEDIATE: RestOfDigits RESULT: Count (the number of digits in N) HEADER: Count NumberOfDigits(N)
Practice problem #1 – solution – cont’d BODY: RestOfDigits= N / 10 RestOfDigits= 0 ? false true Count NumberOfDigits(RestOfDigits)Count Count + 1 Count 1
Trace, page 2 Count NumberOfDigits(RestOfDigits) Count NumberOfDigits(N) 25
Trace , page 3 Count NumberOfDigits(RestOfDigits) Count NumberOfDigits(N) 1 2
Trace , page 2 Count NumberOfDigits(RestOfDigits) Count NumberOfDigits(N) 2 25
Let’s see how the code runs • In your recursive method: • Put System.out.println() statements at the following locations (print the actual value of n): • Immediately after local variable declarations 1: Entering method with n = 254 • Just before recursive method call: 2: Recursive call from n = 254 • Just after recursive method call: 3: Returned from recursion with n = 254 • Just before return statement 4: Returning from method with n = 254, count = 3 • In the base case 5: Base case with n = 2
Practice problem #2 • Write a recursive algorithm to test if all the characters in positions 0...N-1 of an array, A, of characters are digits.
Practice problem #2 - solution GIVENS: A (an array of characters) N (test up to this position in array) RESULT: AllDigits (Boolean, true if all characters in position 0..N are digits) HEADER: AllDigits CheckDigits(A,N)
Practice problem #2 – solution – cont’d BODY: A[N-1] ≥ ′0′ AND A[N-1] ′9′ ? false true false true N = 1 ? AllDigits False AllDigits CheckDigits(A, N-1) AllDigits True
Practice problem #2 –– cont’d • Translate the algorithm into a Java method
Practice problem #3 • Write a recursive algorithm to test if a given array is in sorted order.
Practice problem #3 - solution GIVENS: A (an array of integers) N (the size of the array) RESULT: Sorted (Boolean: true if the array is sorted) HEADER: Sorted CheckSorted(A,N)
Practice problem #3 – solution – cont’d BODY: false true N = 1 ? false A[N–2] < A[N–1]? true Sorted True Sorted False Sorted CheckSorted(A, N-1)
Practice problem #4 • Write a recursive algorithm to create an array containing the values 0 to N-1 • Hint: • Sometimes you need 2 algorithms: • The first is a “starter” algorithm that does some setup actions, and then starts off the recursion by calling the second algorithm • The second is a recursive algorithm that does most of the work.
Practice problem #4 - solution GIVENS: N (the size of the array) RESULT: A (the array) HEADER: A CreateArray(N) BODY: A MakeNewArray(N) FillArray(A, N – 1) FillArrayis the recursive algorithm
Practice problem #4 – solution – cont’d Algorithm FillArray GIVENS: A (an array) N (the largest position in the array to fill) MODIFIEDS: A RESULT: (none) HEADER: FillArray(A, N)
Practice problem #4 – solution – cont’d BODY: false N = 0 ? true FillArray(A, N-1) A[N] N
Practice Problem #5: Euclid’s algorithm • The greatest common divisor (GCD) of two positive integers is the largest integer that divides both values with remainders of 0. • Euclid’s algorithm for finding the greatest common divisor is as follows: gcd(a, b) is … • b if a ≥ b and a mod b is 0 • gcd(b, a) if a < b • gcd(b, a mod b) otherwise • Write a recursive algorithm that takes two integers A and B and returns their greatest common divisor. You may assume that Aand Bare integers greater than or equal to 1.
What is the base case? FindGCD(A, B) is … • B if A ≥ B and A MOD B is 0 • FindGCD(B, A) if A < B • FindGCD(B, A MOD B) otherwise • Question: will this algorithm always reach the base case? • Note that A MOD B is at most B – 1.
Euclid’s Algorithm GIVENS: A, B(Two integers > 0) RESULT: GCD (greatest common divisor of A and B) HEADER: GCD FindGCD(A, B)
Euclid’s Algorithm BODY: false true A ≥ B ? false true GCD FindGCD(B, A) A MOD B = 0 ? GCD B GCD FindGCD(B, A MOD B)
Test this method • Create a class Euclid that includes the method findGCD, and also a main( ) method that will ask the user to enter two values and print their GCD. • Try the following: a = 1234, b = 4321 a = 8192, b = 192