注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 CCNA教材推荐
 帮助

Java:Farey序列


2007-12-13 10:54:35
 标签:Farey   [推送到技术圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
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 == true) {
            
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);
    }
}

本文出自 “子 孑” 博客,转载请与作者联系!





    文章评论
 
2007-12-13 11:49:13
不错哦 我要C++ java同时学习

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: