CSE143X More Recursion Examples handout #16
// writes the binary representation of n to System.out
public void writeBinary(int n) {
if (n < 0) {
System.out.print("-");
writeBinary(-n);
} else if (n < 2) {
System.out.print(n);
} else {
writeBinary(n / 2);
System.out.print(n % 2);
}
}
-------------------------------------------------------------------------------
// returns the sum of the numbers in the given array
public int sum(int[] list) {
return sum(list, 0);
}
// computes the sum of the list starting at the given index
private int sum(int[] list, int index) {
if (index == list.length) {
return 0;
} else {
return list[index] + sum(list, index + 1);
}
}
Program DirectoryCrawler.java
-----------------------------
// This program prompts the user for a file or directory name and shows
// a listing of all files and directories that can be reached from it
// (including subdirectories).
import java.io.*;
import java.util.*;
public class DirectoryCrawler {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("directory or file name? ");
String name = console.nextLine();
File f = new File(name);
if (!f.exists()) {
System.out.println("That file or directory does not exist");
} else {
print(f, 0);
}
}
// pre : f.exists()
// post: prints a directory listing for the given file using the given
// level of indentation. Prints just the file name for a file.
// For a directory, prints the name and a complete listing of all
// files/directories under this directory, using indentation to
// indicate the level.
public static void print(File f, int level) {
for (int i = 0; i < level; i++) {
System.out.print(" ");
}
System.out.println(f.getName());
if (f.isDirectory()) {
for (File subF : f.listFiles()) {
print(subF, level + 1);
}
}
}
}
// Program that draws the Sierpinski fractal.
import java.awt.*;
import java.util.*;
public class Sierpinski {
public static final int SIZE = 512; // height/width of DrawingPanel
public static void main(String[] args) {
// prompt for level
Scanner console = new Scanner(System.in);
System.out.print("What level do you want? ");
int level = console.nextInt();
// initialize drawing panel
DrawingPanel p = new DrawingPanel(SIZE, SIZE);
p.setBackground(Color.CYAN);
Graphics g = p.getGraphics();
// compute triangle endpoints and begin recursion
int triangleHeight = (int) Math.round(SIZE * Math.sqrt(3.0) / 2.0);
Point p1 = new Point(0, triangleHeight);
Point p2 = new Point(SIZE / 2, 0);
Point p3 = new Point(SIZE, triangleHeight);
drawFigure(level, g, p1, p2, p3);
}
// Draws a Sierpinski fractal to the given level inside the triangle
// whose vertices are (p1, p2, p3).
public static void drawFigure(int level, Graphics g,
Point p1, Point p2, Point p3) {
if (level == 1) {
// base case: simple triangle
Polygon p = new Polygon();
p.addPoint(p1.x, p1.y);
p.addPoint(p2.x, p2.y);
p.addPoint(p3.x, p3.y);
g.fillPolygon(p);
} else {
// recursive case, split into 3 triangles
Point p4 = midpoint(p1, p2);
Point p5 = midpoint(p2, p3);
Point p6 = midpoint(p1, p3);
// recurse on 3 triangular areas
drawFigure(level - 1, g, p1, p4, p6);
drawFigure(level - 1, g, p4, p2, p5);
drawFigure(level - 1, g, p6, p5, p3);
}
}
// returns the midpoint of p1 and p2
public static Point midpoint(Point p1, Point p2) {
return new Point((p1.x + p2.x) / 2, (p1.y + p2.y) / 2);
}
}