ImageVerifierCode 换一换
格式:DOCX , 页数:76 ,大小:183.62KB ,
资源ID:18082024      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18082024.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(经典算法的Java实现36题文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

经典算法的Java实现36题文档格式.docx

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