This lab is a look at recursion and a few other exciting things.
The main method
public static void main(String[] args) {
System.out.println("Enter your number") ;
java.util.Scanner stdin = new java.util.Scanner(System.in) ;
String word = stdin.next() ;
int n ;
try {
n = Integer.parseInt(word) ;
} catch (NumberFormatException nfe) {
System.out.println("Bad input: "+ word) ;
return ;
}
if (n < 0) {
System.out.println("Too negative: " + n) ;
return ;
}
if ((long)n * n > Integer.MAX_VALUE) {
System.out.println("Too large: " + n) ;
return ;
}
int x = floorSqrt(n) ;
System.out.println("" + n + " = "
+ x + "*" + x
+ "+" + (n-x*x)) ;
// Need -enableassertions at run time
// Project properties -> Run -> VMoptions=-ea
assert (x+1)*(x+1) > n && n >= x*x ;
}
First, look at all that input validation in the main
routine.
assert. It tells you that we are looking
to set x to the smallest integer whose square is
greater than or equal to n
A little recursion
Before going to the lab we are going to discuss the writing of a recursive routine that use divide-and-conquer to compute the floored square root.
Here is a javadoc style summary for this routine.
private static int binarySqrt(int n, int hi, int lo)
This routine should only be called under the following three conditions.
n,hiandloare all positivehi2 does not exceed the range of Javaintshi2 >nandn≥lo2
A recursion wrapper
Use the following routine as an intermediary between
main and binarySqrt.
public static int floorSqrt(int n) {
if (n <= 1) {
return n ;
} else {
return binarySqrt(n, n, 0) ;
}
}
Homework 3
Homework 3 will be published and due next Thursday evening. The homework assignment will start wherever we end in lab.