1、 public void move(int n,char a,char b,char c) if(n=1) System.out.println(盘 + n + 由 + a + 移至 + c); else move(n - 1, a, c, b); System.out.println( move(n - 1, b, a, c); (2)费式数列Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:“若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产).”。如果不太理解这个例子的
2、话,举个图就知道了,注意新生的小免子需一个月成长期才会投入生产,类似的道理也可以用于植物的生长,这就是Fibonacci数列,一般习惯称之为费氏数列,例如以下:1、1 、2、3、5、8、13、21、34、55、89.依说明,我们可以将费氏数列定义为以下:fn = fn-1 + fn-2 if n 2fn = 1 if n = 0, 1实现:/Java程序的实现:public class Fibonacci public static void main(String args) int fib = new int20; fib0 = 0; fib1 = 1; for(int i = 2; i
3、fib.length; i+) fibi = fibi-1 + fibi-2; for(int i = 0; System.out.print(fibi + System.out.println();(3)巴斯卡(Pascal)三角形巴斯卡(Pascal)三角形基本上就是在解 nCr ,因为三角形上的每一个数字各对应一个nCr,其中 n 为 row,而 r 为 column,如下:0C01C0 1C12C0 2C1 2C23C0 3C1 3C2 3C34C0 4C1 4C2 4C3 4C4对应的数据如下图所示:巴斯卡三角形中的 nCr 可以使用以下这个公式来计算,以避免阶乘运算时的数值溢位:n
4、Cr = (n-r+1)*nCr-1/rnC0 = 1/java实现import java.awt.*;import javax.swing.*;public class Pascal extends JFrame public Pascal() setBackground(Color.white); setTitle(巴斯卡三角形 setSize(520, 350); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(700,700); setVisible(true); private long combi(int n, int
5、 r) int i; long p = 1; for(i = 1;= r; p = p * (n-i+1) / i; return p; public void paint(Graphics g) g.setColor(Color.white); g.clearRect(0,0,getSize().width,getSize().height); g.setColor(Color.red); final int N = 12; int n, r, t; for(n = 0; n = N; n+) for(r = 0; r = n; r+) g.drawString( + combi(n, r)
6、,(N-n)*20 + r * 40, n * 20 + 50); public static void main(String args) Pascal frm = new Pascal();(4)蒙地卡罗法求 PI蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名。蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式。蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值;假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积
7、就为1,如下图所示:如果随意的在正方形中投射飞标(点)好了,则这些飞标(点)有些会落于四分之一圆内,假设所投射的飞标(点)有n点,在圆内的飞标(点)有c点,则依比例来算,就会得到上图中最后的公式。至于如何判断所产生的点落于圆内,很简单,令乱数产生X与Y两个数值,如果X2+Y2等于1就是落在圆内。/java程序实现public class PI final int N = 50000; int sum = 0; for(int i = 1; N; i+) double x = Math.random(); double y = Math.random(); if(x * x + y * y) x
8、i) num+; yi) num-; return num; public static void main(String args) throws IOException BufferedReader buf = new BufferedReader(new InputStreamReader(System.in);输入来访时间与离开时间(024):范例:10 15输入-1结束 java.util.ArrayList list = new ArrayList(); while(true) System.out.print( String input = buf.readLine(); if(
9、input.equals(-1) break; list.add(input); int x = new intlist.size(); int y = new intlist.size(); String input = (String) list.get(i); String strs = input.split( xi = Integer.parseInt(strs0); yi = Integer.parseInt(strs1); Arrays.sort(x); Arrays.sort(y); for(int time = 0; time 25; time+) System.out.pr
10、intln(time + 时的最大访客数: + MaxVisit.maxGuest(x, y, time);(8)洗扑克牌(乱数排列)洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。初学者通常会直接想到,随机产生1N的乱数并将之存入阵列中,后来产生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。以152的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用一个回圈走访阵列,并随机产生152的乱数,
11、将产生的乱数当作索引取出阵列值,并与目前阵列走访到的值相交换,如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就重新排列了。至于如何判断花色?这只是除法的问题而已,取商数判断花色,取余数判断数字,您可以直接看程式比较清楚。public class ShuffleCard final int N = 52; int poker = new intN + 1; / 初始化阵列 pokeri = i; / 洗牌 int j = (int) (Math.random() * N); if(j = 0) j = 1; int tmp = pokeri; pokeri = pokerj; po
12、kerj = tmp; / 判断花色 switch(pokeri-1) / 13) case 0:System.out.print(桃 break; case 1:心 case 2:砖 case 3:梅 / 扑克牌数字 int remain = pokeri % 13; switch(remain) K case 12:Q case 11:J default:System.out.print(remain + break; if(i % 13 = 0)(9)约瑟夫问题(Josephus Problem)据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人
13、与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。约瑟夫问题可用代数分析来求解,将这个问题扩大好了,假设现在您与m个朋友不幸参与了这个游戏,您要如何保护您与您的朋友?只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆圈内圈是排列顺序,而外圈是自杀顺序,如下图所示:使用
14、程式来求解的话,只要将阵列当作环状来处理就可以了,在阵列中由计数1开始,每找到三个无资料区就填入一个计数,直而计数达41为止,然后将阵列由索引1开始列出,就可以得知每个位置的自杀顺序,这就是约瑟夫排列,41个人而报数3的约琴夫排列如下所示:14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23由上可知,最后一个自杀的是在第31个位置,而倒数第二个自杀的要排在第16个位置,之前的人都死光了,所以他们也就不知道约琴夫与他的朋友并
15、没有遵守游戏规则了。public class Josephus public static int arrayOfJosephus(int number, int per) int man = new intnumber; for(int count = 1, i = 0, pos = -1;count (41-alive)L elseD if(i+1) % 5 = 0)(10)排列组合将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。可以使用递回将问题切割为较小的单元进行排列组合,
16、例如1 2 3 4的排列可以分为1 2 3 4、2 1 3 4、3 1 2 4、4 1 2 3进行排列,这边利用旋转法,先将旋转间隔设为0,将最右边的数字旋转至最左边,并逐步增加旋转的间隔,例如:1 2 3 4 - 旋转1 - 继续将右边2 3 4进行递回处理2 1 3 4 - 旋转1 2 变为 2 1- 继续将右边1 3 4进行递回处理3 1 2 4 - 旋转1 2 3变为 3 1 2 - 继续将右边1 2 4进行递回处理4 1 2 3 - 旋转1 2 3 4变为4 1 2 3 - 继续将右边1 2 3进行递回处理 public class Permutation public static void perm(int num, int i) if(i num.length - 1) for(int j = i; j i; k-) numk = numk-1; numi = tmp; p
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1