| 
 
 The Farey sequences of orders 1 to 8 are 
F1 = {0⁄1, 1⁄1} 
F2 = {0⁄1, 1⁄2, 1⁄1} 
F3 = {0⁄1, 1⁄3, 1⁄2, 2⁄3, 1⁄1} 
F4 = {0⁄1, 1⁄4, 1⁄3, 1⁄2, 2⁄3, 3⁄4, 1⁄1} 
F5 = {0⁄1, 1⁄5, 1⁄4, 1⁄3, 2⁄5, 1⁄2, 3⁄5, 2⁄3, 3⁄4, 4⁄5, 1⁄1} 
F6 = {0⁄1, 1⁄6, 1⁄5, 1⁄4, 1⁄3, 2⁄5, 1⁄2, 3⁄5, 2⁄3, 3⁄4, 4⁄5, 5⁄6, 1⁄1} 
F7 = {0⁄1, 1⁄7, 1⁄6, 1⁄5, 1⁄4, 2⁄7, 1⁄3, 2⁄5, 3⁄7, 1⁄2, 4⁄7, 3⁄5, 2⁄3, 5⁄7, 3⁄4, 4⁄5, 5⁄6, 6⁄7, 1⁄1} 
F8 = {0⁄1, 1⁄8, 1⁄7, 1⁄6, 1⁄5, 1⁄4, 2⁄7, 1⁄3, 3⁄8, 2⁄5, 3⁄7, 1⁄2, 4⁄7, 3⁄5, 5⁄8, 2⁄3, 5⁄7, 3⁄4, 4⁄5, 5⁄6, 6⁄7, 7⁄8, 1⁄1}  
 
在第n级上,仅当c+d<=n时,才将一个新的分数a+b/c+d插到两个相邻的分数a/c和b/d之间.下面的程序,对给定的自然数n,通过不断扩展以创建第n级的分数链表. 
 
所使用的数据结构为一个链表节点 
 
| public class Node { |  |     private int upval;//分子 |  |     private int dnval;//分母 |  |     private Node next; |   |  |     public Node(int up, int down) { |  |         upval = up; |  |         dnval = down; |  |         next = null; |  |     } |   |  |     public Node(int up, int down, Node next) { |  |         upval = up; |  |         dnval = down; |  |         this.next = next; |  |     } |   |  |     public int getUpval() { |  |         return upval; |  |     } |   |  |     public void setUpval(int upval) { |  |         this.upval = upval; |  |     } |   |  |     public int getDnval() { |  |         return dnval; |  |     } |   |  |     public void setDnval(int dnval) { |  |         this.dnval = dnval; |  |     } |   |  |     public Node getNext() { |  |         return next; |  |     } |   |  |     public void setNext(Node next) { |  |         this.next = next; |  |     } |  | } |  
  
 
 
下面是Farey序列的具体实现 
1.构造子先设定了两个节点,即n=1的情况; 
2.generate(int n)用于生成序列,每次会遍历当前序列,如果具备插入的点,则插入之,且将added设置为真; 
3.如果遍历完后布尔值added为假,则说明序列已构造完成; 
4.整型数turn表示每次需要判断插入的次数,它和前一轮得到的链表长度有关;  
 
| public class FareyList { |  |     private Node head; |  |     private int size; |   |  |     public FareyList() { |  |         head = new Node(0, 1); |  |         Node next = new Node(1, 1); |  |         head.setNext(next); |  |         size = 2; |  |     } |   |  |     public void insertAfter(Node newNode, Node prev) { |  |         newNode.setNext(prev.getNext()); |  |         prev.setNext(newNode); |  |         size++; |  |     } |   |  |     public void generate(int n) { |  |         if (n <= 0) |  |             throw new UnsupportedOperationException(); |  |         if (n == 1) { |  |             printList(); |  |             return; |  |         } |   |  |         boolean added = true; |  |         while (added) { |  |             int turn = size - 1; |  |             added = false; |  |             Node node1 = head; |  |             Node node2 = head.getNext(); |  |             for (int i = 1; i <= turn; i++) { |  |                 if ((node1.getDnval() + node2.getDnval()) <= n) { |  |                     Node newNode = new Node( |  |                             node1.getUpval() + node2.getUpval(), node1 |  |                                     .getDnval() |  |                                     + node2.getDnval()); |  |                     insertAfter(newNode, node1); |  |                     added = true; |  |                 } |  |                 node1 = node2; |  |                 node2 = node2.getNext(); |  |             } |  |         } |  |         printList(); |  |     } |   |  |     private void printList() { |  |         Node node = head; |  |         while (node != null) { |  |             System.out.print(node.getUpval() + "  "); |  |             node = node.getNext(); |  |         } |  |         System.out.println(); |  |         node = head; |  |         while (node != null) { |  |             System.out.print(node.getDnval() + "  "); |  |             node = node.getNext(); |  |         } |  |         System.out.println(); |  |     } |   |  |     public static void main(String[] args) { |  |         new FareyList().generate(8); |  |     } |  | } |  
  |