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); | } | } |
|