/************************************************************************* * Compilation: javac Farey.java Rational.java * Execution: java Farey.java N * * Sample execution: * * % java Farey 2 * 0/1 1/2 1/1 * * % java Farey 3 * 0/1 1/3 1/2 2/3 1/1 * * % java Farey 4 * 0/1 1/4 1/3 1/2 2/3 3/4 1/1 * * % java Farey 5 * 0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1 * * *************************************************************************/ public class Farey { private class Node { Rational item; Node next; Node(Rational item, Node next) { this.item = item; this.next = next; } public String toString() { return "" + item; } } public void printList(Node list) { for (Node x = list; x != null; x = x.next) System.out.print(x + " "); System.out.println(); } public void printSequence(int n) { Rational r1 = new Rational(0, 1); Rational r2 = new Rational(1, 1); Node list = new Node(r2, null); Node x, y, z; list = new Node(r1, list); // make n-1 passes for (int i = 0; i < n - 1; i++) { // in each pass, for each pair of neighboring rationals a/b, c/d, insert // the mediant (a+c)/(b+d) assuming the numerator and denominator are <= n for (x = list; x.next != null; x = z) { z = x.next; Rational m = Rational.mediant(x.item, z.item); if (m.denominator() <= n) { y = new Node(m, z); x.next = y; } } } printList(list); } public static void main(String[] args) { int N = Integer.parseInt(args[0]); Farey f = new Farey(); f.printSequence(N); } }