CSE143 Simple Recursion Examples handout #8
// iterative method that produces an output line of exactly n stars
public void writeStars(int n) {
for (int i = 0; i < n; i++) {
System.out.print("*");
}
System.out.println();
}
// recursive method that produces an output line of exactly n stars
public void writeStars2(int n) {
if (n <= 0) {
System.out.println();
} else {
System.out.print("*");
writeStars2(n - 1);
}
}
// post: reads a file, writing the lines to System.out in reverse order
public void reverse(Scanner input) {
if (input.hasNextLine()) {
String line = input.nextLine();
reverse(input);
System.out.println(line);
}
}
// returns the integer obtained by replacing every digit of n with two of
// that digit. For example, stutter(348) returns 334488.
public int stutter(int n) {
if (n < 0) {
return -stutter(-n);
} else if (n < 10) {
return n * 11;
} else {
return 100 * stutter(n / 10) + stutter(n % 10);
}
}
CSE143 Trace of Simple Recursion Examples
Below is a trace of the call writeStars2(3):
writeStars2(3); (n > 0, recursive case)
System.out.print("*");
writeStars2(2); (n > 0, recursive case)
System.out.print("*");
writeStars2(1); (n > 0, recursive case)
System.out.print("*");
writeStars2(0); (n == 0, base case)
System.out.println();
Below is a trace of the call Reverse(input) when the input file contains
"this"/"is"/"fun"/"no?" on separate lines:
reverse(input);
line = input.nextLine(); (line == "this", recursive)
reverse(input);
| line = input.nextLine(); (line == "is", recursive)
| reverse(input);
| | line = input.nextLine(); (line == "fun", recursive)
| | reverse(input);
| | | line = input.nextLine(); (line == "no?", recursive)
| | | reverse(input);
| | | | input.hasNextLine() returns false (base case)
| | | System.out.println(line); (output "no?")
| | System.out.println(line); (output "fun")
| System.out.println(line); (output "is")
System.out.println(line); (output "this")
Below is a trace of the call stutter(-348):
stutter(-348)
is < 0, so execute first branch
compute stutter(-n), which is stutter(348)
| not < 0, not < 10, so execute third branch
| compute stutter(34)
| | not < 0, not < 10, so execute third branch
| | compute stutter(3)
| | | not < 0, but is < 10, so execute second branch
| | | return n * 11 (33)
| | compute stutter(4)
| | | not < 0, but is < 10, so execute second branch
| | | return n * 11 (44)
| | return first * 100 + second (33 * 100 + 44 = 3344)
| compute stutter(8)
| | not < 0, but is < 10, so execute second branch
| | return n * 11 (88)
| return first * 100 + second (3344 * 100 + 88 = 334488)
return the negation of that result (-334488)