北京理工大学计算机学院金旭亮,方法北京理工大学计算机学院

java 4
金旭亮 软件工程模块化原则 Modules(模块):将一个复杂的系统划分为子模块,便于设计、实现和维护 Java中的程序模块:方法、类、包Java程序中最基本的构造单元是类,而类中最重 要的成员就是方法。
金旭亮Java编程系列(2014) Java模块实例:JDK中的Math类 java.lang.Math类提供了通用的数学函数方法例如:Math.sqrt(900.0)可得到900的平方根 Demo:TestMath.java 需要指出的是,这些数学函数方法都是静态方法。
所以可以用 的方式直接调用 类名.方法名 金旭亮Java编程系列(2014) 使用静态导入 从JDK5.0开始,支持一种称为“静态导入”的方法: importstaticjava.lang.Math.*; 从而允许在Java代码中省略类名只写静态方法名: System.out.println(abs(-100)); 上述方法完全等价于: System.out.println(Math.abs(-100)); 金旭亮Java编程系列(2014) 类方法的编写 
看看JDK提供的数学函数类Math的编写方式,我们可以知道,将方法放入类中,并将其定义为静态(static)的是面向对象软件提供类似于C语言程序中“全局函数”的基本手段。
我们也可以开发自己的方法,只需创建一个类,然后为其编写声明为public的函数即可。
金旭亮Java编程系列(2014) 在Java中定义方法 语法格式: 访问权限[static]返回值类型方法名(参数列表){ 语句…}方法的返回值:return表达式; 金旭亮Java编程系列(2014) 示例:SquareInt.java 这个例子中,程序员自定义了一个求平方数的静方法Square 金旭亮Java编程系列(2014) 自定义Java方法示例:随机数生成 使用Math.random()生成随机数 (int)(Math.random()*6) •产生0–5之间的随机数 示例:RandomInt.java这个例子说明了随机数的生成方法。
金旭亮Java编程系列(2014) 使用Random类生成随机数 JDK提供了一个Random类,可以更方便地生成随机数。
Demo:TestRandom.java相同“种子(seed)”的Random对象会生成相 同的随机数。
Demo:TestSeed.java通常使用以下方法生成较好的“随机数”,它以 当前时间为“种子”。
Randomran=newRandom(System.currentTimeMillis()); 金旭亮Java编程系列(2014) 随机数应用示例:RollDie.java 这个示例展示了利用随机数来模拟骰子滚动的统计结果。
巧妙地利用随机数,是很多游戏提升可玩性的重要手段 完全“手写代码实现”随机数生成 生成随机数的数学公式 xn1(axnc)modm Multiplier Increment Modulus Seed:x0 金旭亮Java编程系列(2014) 纯随机数发生器 xn1(axnc)modm Modulus=231-1=int.MaxValueMultiplier=75=16807C=0当显示过231-2个数之后,才可能重复。
•动手动脑: 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 金旭亮Java编程系列(2014) 学习指导 在实际开发中,生成随机数是一个比较有用的功能,可以将实现它的相关代码整理并收集起来。
在学习过程中应该注意积累和整理各种有用的代码,分门别类地整理好,建立自己的代码仓库,这样一来,在编程时就能快速查找到相应的代码,从而有效地提升自己的开发效率。
使用自己收集整理的资料库,通常比使用搜索引擎查找资料要高效得多! 金旭亮Java编程系列(2014) 参数可变的方法 从JDK5.0起,Java支持可变参数的方法实例:VariableArgumentsTest.java publicstaticdoublemax(double...values){ doublelargest=Double.MIN_VALUE;for(doublev:values) if(v>largest)largest=v;returnlargest;} 定义 System.out.println("Max:"+max(1,11,300,2,3)); 使用 金旭亮Java编程系列(2014) 可变参数的特点 只能出现在方法参数列表的最后“…”位于变量类型和变量名之间,前后有无空 格均可。
调用可变参数方法时,编译器为该可变参数隐含 创建一个数组,在方法体中以数组的形式访问可变参数。
金旭亮Java编程系列(2014) 动手动脑 请看以下代码,你发现了有什么特殊之处吗? Demo:MethodOverLoad 金旭亮Java编程系列(2014) “方法重载”的要点 上述示例代码展示了Java的“方法重载(overload)”特性。
满足以下条件的两个或多个方法构成“重载”关系:
(1)方法名相同;
(2)参数类型不同,参数个数不同,或者是参数类型的 顺序不同。
注意:方法的返回值不作为方法重载的判断条件 练习:查看一下JDK中System.out.println()方法,你发现了什么? 金旭亮Java编程系列(2014) 递归 直观了解递归 以“鱼”为笔绘制“鱼” 金旭亮Java编程系列(2014) 递归的编程实现 一个构成递归调用的函数 voidDonotRunMe(){ DonotRunMe(); } 简言之:递归就是“自己调用自己”。
金旭亮Java编程系列(2014) 递归的定义 Analgorithmiscalledrecursive[ri'kə:siv] ifitsolvesaproblembyreducingittoaninstanceofthesameproblemwithsmallerinput一个递归的算法,会将同一个“大”问题的“规模”不断压缩,直到易于处理为止。
往往体现为代码要处理的数据量在递归前后不断“递减”。
金旭亮Java编程系列(2014) 通过实例理解递归
(1) Demo:CalculateN编个程序求n!
分析:1!
=12!
=1*2=1!
*23!
=1*2*3=2!
*3…..n!
=1*2*3*…*n=(n-1)!
*n 金旭亮Java编程系列(2014) 通过实例理解递归
(2) 从n!
的数学公式可以看到,要计算n!
可以先计算(n-1)!
,得到(n-1)!
的结果之后,将其乘以n就得到n!

这个过程可以一直持续到2!
,这时,1!
=1已知,于是可以计算出2!。
由2!
再倒推出3!
,4!
,…,最后得到n!
,问题解决 金旭亮Java编程系列(2014) 具体编程实现n!
的递归求解 分析:函数f(n):返回n!
递归公式:f(n)=n*f(n-1)结束递归的条件:n=
1 金旭亮Java编程系列(2014) 递归的特点 先从大到小,再从小到大。
每个步骤要干的事情都是类似的,只不过 其规模“小一号”。
必须要保持递归调用的过程可以终结 金旭亮Java编程系列(2014) 递归编程的模式 每个递归函数的开头一定是判断递归结束条件是否满足的语句(一般是if语句) 函数体一定至少有一句是“自己调用自己”的。
每个递归函数一定有一个控制递归可以终结的变 量(通常是作为函数的参数而存在)。
每次自己调用自己时,此变量会变化(一般是变小),并传送给被调用的函数。
金旭亮Java编程系列(2014) 递归vs递推 现场演示:使用递推的方法求n!
要点:“递归”是“由后至前再回来”,要求第n项,先求第n-
1 项,……,倒推到前面的可计算出的某项,然后再返回。
“递推”是“从前到后”,先求第1项,然后,在此基础上 求第2项,第3项,直至第n项,通常可以直接使用循环语句实现 在开发中,很多算法可以既可以使用递归也可以使用递推(iterative)实现,要依据具体情况进行决断。
金旭亮Java编程系列(2014) 关于递归 在软件科学中,递归这种思想有着重要的应用,比如,许多计算机算法都是用递归实现的。
在具体的软件开发实践中,递归也用得非常多。
对于初学者而言,要一下子理解递归比较困难, 只能在开发实践中慢慢体会,最终方能灵活地应用递归解决实际问题。
金旭亮Java编程系列(2014) 处理大数字与浮点数 金旭亮Java编程系列(2014) 程序错了吗? 演示:CalculateN示例程序中的BUG 阶乘数怎么可能出现负数? 金旭亮Java编程系列(2014) 问题的根源 java中int类型的数值占32位,是有符号的: 正数:000……0~011……1即32个全“0”到31个全“1”负数:100……0~111……1即31个全“0”到31个全“1” Integer.MAX_VALUE=231-1=2,147,483,647Integer.MIN_VALUE=-231=-2,147,483,648类似地,long类型的数值占64位: Long.MAX_VALUE=263-1=9,223,372,036,854,775,807Long.MIN_VALUE=-263=-9,223,372,036,854,775,808 金旭亮Java编程系列(2014) 结论 由于计算机使用固定的位数来保存数值,因此,能处理的数值大小是有限的,当要处理的数值超过了这一范围时,计算机将会自动截断数值的二进制表示为它所能处理的最多位数,这将导致错误的处理结果。
金旭亮Java编程系列(2014) 处理无限大的整数 Java提供了一个BigInteger类,支持大整数的加减乘除运算。
publicstaticBigIntegercalculateN2(intn){if(n==1||n==0){returnBigInteger.valueOf
(1);}returnBigInteger.valueOf(n).multiply(calculateN2((n-1))); } 金旭亮Java编程系列(2014) 如果要比较两个浮点数…… 请看以下代码: doublei=0.0001;doublej=0.00001;System.out.println(i==j);//输出:true 原因:计算机不能精确地表达浮点数(特殊形式的除外),因此,当需要比较两个浮点数是否相等时,应该比较其差的绝对值是否在某个允许范围之内即可。
if(Math.Abs(i-j)<1e-10)System.out.println("true"); elseSystem.out.println("false"); 金旭亮Java编程系列(2014) 课后作业 背景:杨辉三角形与组合数公式 00110122201233330123 1111211331 利用杨辉三角 形原理来计算组合数 金旭亮Java编程系列(2014) 课后作业 使用计算机计算组合数:
(1)使用组合数公式利用n!
来计算 Ckn!
nk!
(nk)!

(2)使用递推的方法用杨辉三角形计算 Cnk1Cnk1Cnk
(3)使用递归的方法用组合数递推公式计算 金旭亮Java编程系列(2014) 课后作业 递归编程解决汉诺塔问题。
用Java实现 金旭亮Java编程系列(2014) 课后作业 使用递归方式判断某个字串是否是回文(palindrome) “回文”是指正着读、反着读都一样的句子。
比如“我是谁是我”使用递归算法检测回文的算法描述如下:Asingleorzero-characterstringisapalindrome.Anyotherstringisapalindromeifthefirstandlastcharactersarethesame,andthestringthatremains,exceptingthosecharacters,isapalindrome. 金旭亮Java编程系列(2014)

标签: #软件 #软件 #鼠标 #caj #cu #牌子 #cmc #相机