KINGABDULAZIZUNIVERSITY
Faculty of Computing & Information Technology Department of Computer Science
Lab Manual
CPCS204
Data Structures 1
1435/1436H
Lab - 5
Learning Procedure
1) Stage
J
(Journey inside-out the concept) 2) Stagea
1 (apply the learned)3) Stage
v
(verify the accuracy) 4) Stagea
2 (assess your work)CPCS204 – The Lab Note Lab-5 1
Term I
2015 Lab-5: Recursion
Laboratory 5:
Statement Purpose:
This lab will give you practice with Recursion.
Activity Outcomes:
This lab teaches you the following topics:
Simple recursion
Recursion with a return value
Binary search (divide and conquer) using recursion
Recursive implementation of Merge sort
Practice exploiting recursive methods to solving a set of practical problems
Instructor Note:
As pre-lab activity, review Ch9, from the book Data Structures with Java by John R. Hubbard and also the relevant instructor’s slides.
Names I.D.
1. .………..………. ………
2. ..……….. ………
3. .………... ………
4. .……….. ..……….
CPCS204 – The Lab Note Lab-5 2
Term I
2015 Lab-5: Recursion
1) Stage J (Journey)
Recursion: is a programming technique that allows the programmer to express operations in terms of themselves. In JAVA, this takes the form of a function that calls itself. A useful way to think of recursive functions is to imagine them as a process being performed where one of the instructions is to "repeat the process". This makes it sound very similar to a loop because it repeats the same code, and in some ways it is similar to looping. On the other hand, recursion makes it easier to express ideas in which the result of the recursive call is necessary to complete the task. Of course, it must be possible for the
"process" to sometimes be completed without the recursive call.
Simple example: is the idea of building a wall that is ten feet high; if I want to build a ten foot high wall, then I will first build a 9 foot high wall, and then add an extra foot of bricks. Conceptually, this is like saying the "build wall" function takes a height and if that height is greater than one, first calls itself to build a lower wall, and then adds one a foot of bricks.
Criteria of Recursion:
Every recursion should have the following characteristics.
1. A simple base case which we have a solution for and a return value.
2. A way of getting our problem closer to the base case. I.e. a way to chop out part of the problem to get a somewhat simpler problem.
3. A recursive call which passes the simpler problem back into the method.
2) Stage a
1(apply)
Example 1: Factorial Function
Apply and test the simple QUEUE implementation using Circular Arrays below:
You have probably seen the factorial function before. It is defined for all integers greater or equal to zero:
For example,
factorial( 5 ) = 5 * factorial( 4 )
CPCS204 – The Lab Note Lab-5 3
Term I
2015 Lab-5: Recursion
= 5 * ( 4 * factorial( 3 ) ) = 5 * ( 4 * (3 * factorial( 2 ) ) )
= 5 * ( 4 * (3 * (2 * factorial( 1 ) ) ) ) = 5 * ( 4 * (3 * (2 * ( 1 * factorial( 0 ) ) ) ) ) = 5 * ( 4 * (3 * (2 * ( 1 * 1 ) ) ) )
= 5 * 4 * 3 * 2 * 1 * 1 = 120 Often factorial(N) is written as N!
factorial( 0 ) = 1 // Base Case
factorial( N ) = N * factorial( N-1 ) // Recursive Case // Example: Concept of recursion
// To Compute Factorial of any given number
import javax.swing.JOptionPane;
public class ComputeFactorial {
public static void main(String[] args) {
String intString = JOptionPane.showInputDialog("Please enter a non-negative integer:");
int n = Integer.parseInt(intString);
JOptionPane.showMessageDialog(null, "Factorial of " + n + " is " + factorial(n));
}
// Recursive Method to solve the factorial of a number public static long factorial(int n) {
if (n == 0) { return 1;
} else {
return n * factorial(n - 1); // Recursive call }
} }
Output:
CPCS204 – The Lab Note Lab-5 4
Term I
2015 Lab-5: Recursion
Activity1:
In order to calculate POWER of given x, y.
We have probably worked out 25 something like this:
We started with the simplest case: 20 = 1
Then we multiplied the previous result by 2: 21 = 2 x 20 = 2 Then we multiplied the previous result by 2: 22 = 2 x 21 = 4 Then we multiplied the previous result by 2: 23 = 2 x 22 = 8 Then we multiplied the previous result by 2: 24 = 2 x 23 = 16 Then we multiplied the previous result by 2: 25 = 2 x 24 = 32 In general, 2n = 2 x 2n-1
provided n is an integer >= 0.
So………….
Now we can write the Java method to return the value of two raised to some power, n.
Task: Write and test your java code to solve the above given problem.
hint: you can copy the ComputeFactorial code and make some changes.
Example 2: Binary search
Binary Searching involves searching for an element in an array, where the items are arranged in ascending or descending order. That means the entries in the array are sorted. If you want to learn how to write a function that does this, keep reading.
Algorithm for Binary Search based on the following three cases:
Case 1: If the key is less than the middle element, recursively search the key in the first half of the array.
CPCS204 – The Lab Note Lab-5 5
Term I
2015 Lab-5: Recursion
Case 2: If the key is greater than the middle element, recursively search the key in the second half of the array.
Case 3: If the key is equal to the middle element, the search ends with a match.
Carry on repeating the first two steps until the middle element is equal to the Key.
// Example: Concept of recursion
// To implement binary search using recursion
import java.util.Scanner;
public class BinarySearchDemo {
public static void main(String[] args) { //a given array hast to be sorted
int [] arr = {11,12,14,16,27,33,68,75};
//input the target key to search for
System.out.print("Enter the KEY target number for searching: ");
Scanner in = new Scanner(System.in);
int key = in.nextInt();
//trial to find key in arr using biSearch
int result = biSearch(arr, 0, arr.length-1, key);
if (result == -1)
System.err.println("The target number does not exist !!!");
else
System.out.println("The target number ("+key+") exists in index ("+result+") the given array.");
}
public static int biSearch(int[] a, int Li, int Hi, int x){
if (Li > Hi) { return -1;
CPCS204 – The Lab Note Lab-5 6
Term I
2015 Lab-5: Recursion
}
int mid = (Li + Hi) / 2;
if (a[mid] == x) { return mid;
} else if (a[mid] > x) { Hi = mid - 1;
} else {
Li = mid + 1;
}
return biSearch(a, Li, Hi, x);
} }
Output:
Enter the KEY target number for searching: 27
The target number (27) exists in index (4) the given array.
Or:
Enter the KEY target number for searching: 55 The target number does not exist !!!
Example 3: Merge sort using recursion
Merge sort is a more efficient sorting algorithm than either selection sort or bubble sort.
The following are the steps of the merge sort:
1. Split the original list into two halves 2. sort each half (using merge sort)
3. merge the two sorted halves together into a single sorted list
CPCS204 – The Lab Note Lab-5 7
Term I
2015 Lab-5: Recursion
// To implement merge sort using recursion
public class MergeSortClass { private int[] theArray;
public MergeSortClass(int [] unsortedList){
theArray = unsortedList;
}
public void mergeSort(int[] list, int first, int last) { if (first == last) // if range is 1,
{
return; // no use sortin } else { // find midpoint int mid = (first + last) / 2;
// sort low half
mergeSort(list, first, mid);
// sort high half
mergeSort(list, mid + 1, last);
// merge them
merge(list, first, mid + 1, last);
} // end else }
// Merge method that will merge two sorted list (array) into one sorted array.
private void merge(int[] list, int lowPtr, int highPtr, int upperBound) {
int j = 0; // workspace index int lowerBound = lowPtr;
int mid = highPtr - 1;
int n = upperBound - lowerBound + 1; // # of items while (lowPtr <= mid && highPtr <= upperBound) { if (theArray[lowPtr] < theArray[highPtr]) { list[j++] = theArray[lowPtr++];
} else {
list[j++] = theArray[highPtr++];
} }
while (lowPtr <= mid) {
list[j++] = theArray[lowPtr++];
}
while (highPtr <= upperBound) { list[j++] = theArray[highPtr++];
}
for (j = 0; j < n; j++) {
theArray[lowerBound + j] = list[j];
} } }
// MergeSortDemo.java: is a testing MergeSortClass
CPCS204 – The Lab Note Lab-5 8
Term I
2015 Lab-5: Recursion
public class MergeSortDemo {
public static void main(String[] args) {
int a [] = {38,27,43,3,9,82,10};
MergeSortClass ms = new MergeSortClass(a);
System.out.println("The list before sorting is:");
for(int e:a)
System.out.print(e+" ");
//defining an empty array of size a.length to be used for sorting
int emptyArr [] = new int [a.length];
ms.mergeSort(emptyArr, 0 , a.length-1);
System.out.println("\nThe list after sorting is:");
for(int e:a)
System.out.print(e+" ");
} }
Output:
The list before sorting is:
38 27 43 3 9 82 10 The list after sorting is:
3 9 10 27 38 43 82
CPCS204 – The Lab Note Lab-5 9
Term I
2015 Lab-5: Recursion
3) Stage v (verify)
Practical Activities:
1. Write a recursive method to get sum of all number from 1 up to given number. E.g. Number = 5 Result must be sum (1+2+3+4+5)
hint: you can copy the ComputeFactorial code and make some changes.
2. Write a recursive method to get sum of all even numbers up to given number. E.g. Number = 5 Result must be sum (2+4)
hint: you can copy the ComputeFactorial code and make some changes.
3. Write a recursive method to get sum of all odd numbers up to given number. E.g. Number = 5 Result must be sum (1+3+5)
4. Write a recursive method to get subtraction of all number from 1 up to given number. E.g. Number = 5 Result must be sum (1-2-3-4-5)
5. Write a recursive method to get sum all elements of an array where each is reformed and summed such that 𝐴[0]1 +𝐴[1]1 +𝐴[2]1 + ⋯ +𝐴[𝑖−1]1 .
E.g. double A[]={5,5,6,7,8} ; Result must be sum (15+15+16+17+18) = 0.8345238095238094
6. (Printing the digits in an integer reversely) Write a recursive method that displays an int value reversely on the console using the following header:
public static void reverseDisplay(int value)
For example, reverseDisplay(12345) displays 54321.
4) Stage a
2(assess) Lab Work:
In each laboratory you are assessed on your work within lab session based on your participation, discussions and achievement of lab activities. Thus, each lab has a portion of the (LAB WORK MARK). Therefore, a checklist of each lab is used to evaluate your work. This checklist accounts the following criteria:
Following the lab manual step by step
Answering given questions concisely and precisely
Practicing and implementing given examples correctly
Writing code of required programming tasks
Being focused, positive, interactive and serious during lab session
Asking good questions or answering instructor questions if any
CPCS204 – The Lab Note Lab-5 10
Term I
2015 Lab-5: Recursion
Note: performing given home activities or extra programming is highly recommended to improve your understanding, capability and programming skills.