2016最新java程序设计教程.ppt

上传人:本田雅阁 文档编号:2145838 上传时间:2019-02-21 格式:PPT 页数:148 大小:2.14MB
返回 下载 相关 举报
2016最新java程序设计教程.ppt_第1页
第1页 / 共148页
2016最新java程序设计教程.ppt_第2页
第2页 / 共148页
2016最新java程序设计教程.ppt_第3页
第3页 / 共148页
亲,该文档总共148页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《2016最新java程序设计教程.ppt》由会员分享,可在线阅读,更多相关《2016最新java程序设计教程.ppt(148页珍藏版)》请在三一文库上搜索。

1、J a v a 面向对象程序设计,珊瑚老师qq487116923 J AVA 学习交流群514167678,程序设计例题珊瑚老师qq487116923 珊瑚老师qq487116923,1 编程序,打印数字金字塔(输出阶数可变) 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1,相关知识点珊瑚老师qq487116923,Java程序的起点main方法 Java基本输入输出 打包及导入 循环语句,知识点1:main方法珊瑚老师qq48711692

2、3,声明格式: public static void main(String args) 注意事项: main方法必须属于一个类,不能独立存在于类外 java XXX 告诉编译器执行XXX类中的main方法 程序执行过程就是main方法执行的过程, main方法执行完最后一条语句,则程序退出 参数args:表示程序的执行参数,知识点2:控制台的输入和输出,程序想要与环境进行交互,必须包含输入输出操作: 控制台方式 标准输出设备(System.out) 标准输入设备(System.in) 图形界面方式,控制台输出(3.17,P76 ),Java使用System.out表示标准输出设备(默认为显示

3、器控制台) println方法向标准输出设备打印一行字符串 print 方法向标准输出设备输出参数指定的字符串 printf 方法向标准输出设备输出指定格式的字符串 printf(String format,Object args) format:格式字符串 args:实际参数值 printf(“the sum of 1 and 2 is %d”,1+2);,控制台输出(3.17,P76 ),%d,%md(十进制整数) %o(八进制整数) %x,%X(十六进制整数) %f,%m.nf,%-m.nf (浮点) %e,%E,(指数) %g,%G(由数值大小和精度决定输出格式) %s(字符串) %c

4、(字符) %b,%B (布尔),控制台输出(3.17,P76 ),控制台输入(2.3,P21 ),9,Java使用System.in表示标准输入设备,从标准输入设备(键盘)读入信息的方法: 1. 创建Scanner对象(java.util.Scanner) Scanner input = new Scanner(System.in); 2. 方法next(), nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble(),next- Boolean(), nextLine() 分别获取String, byte

5、, short, int, long, float, double, boolean 或一行文本.,Run,Run,ComputerAreaWithConsoleInput,ComputeAverage,知识点3:打包及导入,包(Package)是Java的程序组织方式,允许将不同的类组合成较小的单元 便于查找和使用类文件 有助于避免命名冲突 在使用许多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突 允许在更广的范围内进行信息隐藏 保护类、数据和方法:可以在包内定义类,而在包外的代码不能访问该类(数据或方法),“包将类名空间划分为更加容易管理

6、的块, 包既是命名机制也是可见性控制机制 ”,打包类( 8.8 ,P226 ),想将一个类放入包中,就必须将包的名字放在源文件的开头,类定义代码前,语法: package 包名; package语句必须是程序的第一条语句 如果源文件中没用package语句,该源文件会被放置在默认包中。(默认包是一个没有名字的包),package mypackage; public class Calculate ,类的导入( 1.9,P14 ),一个类可以使用其所属包中的所有类,以及其它包中的所有public类 访问其它包中的public类有两种方式: 使用类的全路径名: java.util.Date dat

7、e = new java.util.Date(); 使用import语句: import java.util.Date;(明确导入) import java.util.*;(通配导入) 只能导入一个包中的所有类,其子包中的类不会被导入,静态导入,JDK5.0以来,import语句不但可以导入类,还可以导入静态方法和静态属性 import static java.lang.System.*; 可以导入System类的所有静态方法和静态字段 out.println(“hello”);,知识点4:循环语句,while do-while for foreach,程序设计例题,2 编写程序,输入三个实数

8、a,b,c,然后按递增顺序把它们输出,相关知识点,Java基础类型 Java类型转换 Java块 判断语句,知识点1:数据类型,byte short int long float double char boolean,数组 枚举 类 接口,原始数据类型,引用数据类型,整型数据,整型数据简单来说就是整数,Java支持三种形式的整型常量的记法,分别是十进制、八进制和十六进制。 十进制常数记法就是日常生活中用的整数的写法:如365,0,-29456。 八进制常数记法只需要在前面加个0即可,如012表示十进制数10 . 十六进制数记法是开头加上0x或者0X,如0x12表示十进制数18。-0X10表示

9、十进制数-16。,整型数据( 2.8, P25 ),整型变量按所占存储空间的不同可分为四种不同的类型: byte 8位(1字节) short 16位(2字节) int 32位(4字节) (默认) long 64位(8字节) (10L/10l) 注意 C和C+中,数据类型的长度与机器相关,而Java中数据类型的长度固定。 Java中没有unsigned类型,浮点型数据(2.8, P25 ),浮点数可以看成数学上的实数。根据浮点型数据存储位长的不同,可分为: 单精度浮点数(float):32位(4字节) 1.25f/1.25F 双精度浮点数(double)64位(8字节) 1.25 (默认),数值

10、数据类型表示范围,字符型数据( 2.13, P35 ),Java使用单引号来标记字符常量,如A、r就是普通的字符常量(Unicode表)。 字符可分为普通字符和特殊字符。 控制字符就是一种特殊字符,是指回车、换行、制表等起控制作用的字符。 特殊字符使用转义序列进行表示 r 回车 n 换行 t 制表(Tab) 、”,字符型数据,与C/C+不同,Java字符类型数据使用 Unicode进行编码,所以Java字符类型数据占用16位(2字节)内存空间,逻辑(布尔)类型( 3.2, P55 ),布尔变量使用关键字boolean定义,用于保存一个逻辑结果 布尔常量只有两个:true(真)和false(假)

11、 布尔类型值不能与整型相互转换 C/C+中,整数中的零值可以和false互相转化,非零值则对应着true。在Java中是不可以的 if(x=0) op1 else op2,枚举类型,如果某个变量的取值只在一个集合之内,则可以使用枚举类型 枚举类型的声明格式: enum Size SMALL,MEDIUM,LARGE, EXTRA_LARGE ; 枚举类型的变量声明: Size s = Size.MEDIUM,字符串(String)类型( 2.15, P39 ),Java字符串就是一个Unicode字符序列,字符串直接量可以使用双引号括起的字符序列表示(“hello”) Java没有内置的字符串

12、类型,但在标准Java库中提供了一个预定义的String类表示字符串类型 每个用双引号括起来的字符串都是String类的一个实例 eg String s=“”; String greeting=“Hello”;,字符串类型,字符串拼接:“+” 检测字符串是否相等 equals()方法检测两个字符串是否相等 =则判断两个字符串是否存放在相同的位置,知识点2:类型转换及类型提升2.11, P32,运算符是否可以具有不同类型的操作数? 如果两种类型兼容,则可以进行运算,运算时会自动将窄类型提升为宽类型(以数据表达范围为标准) boolean类型与其它类型是不兼容类型 byte、char和short类

13、型是平级类型 byte、char和 short 型值可提升为 int 型 int可以提升到long型 long型可以提升到float型 float型可以自动提升为double型,类型转换及类型提升,对于表达式 所有byte、short和char类型将被提升为int 一个操作数为 long 型,整个表达式提升为 long 型 一个操作数为 float 型,整个表达式提升为 float 型 一个操作数为 double 型,整个表达式提升为 double 型,类型转换及类型提升,自动转化规则,类型强制转换,如果想要将宽类型值赋值给窄类型,则需要强制类型转换 强制类型转换使程序将变量视为某种类型,尽管

14、此变量中包含的是另一类型的数据 float c = 34.89675f; / 将 c 转换为整型(截尾取整) int b = (int) c + 10;,知识点3:Java块,Java块(block)即复合语句,是指由一对花括号括起来的若干简单Java语句 类块 方法块 语句块 静态块 块确定了变量的作用域方法块和语句块内声明变量的作用域由声明处开始,直到块结束,Java块,块可以嵌套在另一块中,但不能在嵌套的两个块中声明同名的变量 public void main(String args) int n; int n; int k; ,知识点4:判断语句,单向if 双向if if-else嵌套

15、 switch语句,if语句例题: 猜生日,通过询问朋友五个问题,猜出他出生于一个月的那一天,GuessBirthday,游戏的数学基础,19 10011 . 7 111. 23 11101,36,switch-case 语句,switch-case 语句可用于替换多选 if-else语句 在表达式可以得出多个值的情况下,使用 switch-case 语句会带来更好的效果 switch-case 语句的语法为: switch (表达式) case 值1: 操作 1 的语句; break; case 值2: 操作 2 的语句; break; . case 值n : 操作 n 的语句; break

16、; default: 默认语句; ,表达式计算出的变量值只能是char, byte, short, 或 int 类型,常量表达式,并且和表达式计算出的值类型相同,break语句和default语句都不是必须的,switch-case 语句,这个结构的执行过程为: (1)求出switch括号内变量的值 (2)将其值顺序地和n1、n2、n3 比较,如果变量值和某个n值相等,程序就转到这个ni后面的语句开始执行,遇到break语句则跳出整个switch语句 (3)如果变量值和任何n值都不等,则执行default后面的语句,最后跳出switch结构 (4)default 子句可有可无,static i

17、nt daysInMonth(int month) int days; switch(month) case 2: days = 28; break; case 4: case 6: case 9: case 11: days = 30; break; default: days = 31; return(days); ,获取各个月份的天数:,程序设计例题,3. 打印n阶杨辉三角形,相关知识点,数组 一维数组 多维数组,知识点1:数组,在Java程序中,数组具有下列特点: 同一数组中的所有元素均属于相同的数据类型,该数据类型称为数组的基本元素类型。 数组一经创建,其元素个数就保持不变,这个长度

18、称为数组的长度(length)。 数组中的每一个元素均能借助于下标(index)来访问。 数组元素的类型既可以是基本类型(如int, float等),也可以是复合类型(如String, Object,甚至数组类型),从而可以产生对象数组、多维数组。,一维数组声明(6.2.1, P158),在Java语言中,一维数组变量声明方式如下: type arrayName; 其中: type表示数组元素的类型,可以是8种基本数据类型之一,也可以是引用类型 “ ”用于表明定义的是一个数组 arrayName就是所要声明的数组变量的名字,一维数组定义/创建(6.2.2, P158),在Java中,数组的创建

19、必须使用“new”操作符,创建一维数组的语法格式如下: arrayName = new elementTypeARRAY_SIZE; 其中: arrayName为已经声明的一维数组变量名 elementType为数组的基类型,它必须是声明array Name时指定的数组基类型或其子类型 ARRAY_SIZE为整数类型,它指定了数组的长度 数组一旦创建,其长度就不能改变。,数组长度(6.2.3, P159),每个数组对象都有一个名为length的属性保存数组的元素个数 arrayName.length,一维数组初始化(6.2.3, P159),创建数组后,如果没有对数组元素进行初始化,则数组元素

20、被赋值为对应于该元素类型的默认值: 数值类型数组中元素的默认值是0 字符类型数组元素默认值为u0000 布尔类型数组元素默认值为false 对象数组中元素的默认值是null,一维数组初始化(6.2.5, P160),对于一维数组可采用如下方法进行初始化: 方法一:遍历数组元素进行初始化: int array = new int10; for( int i = 0; i array .length; i+) arrayi = someValue; 方法二:采用数组初始化列表进行数组创建和初始化,初始化列表中元素的数目就是数组的长度 boolean bArray = false,true,true

21、,false; int iArray = 0,1,2;,一维数组元素引用(6.2.4, P159),对数组的元素的访问可以通过下标进行: arrayNameindex; 其中: arrayName是声明的数组名 index是一个整型数值,用于表示要访问的元素下标(注意下标取值范围应该小于 arrayName.length, 0,length)),数组的处理,数组处理经常使用for循环(类型相同,次数固定) for(int i=0;iarray.length;i+) / arrayi相关操作 也可以使用foreach循环 for( type var :array) / var相关操作 一般用于数

22、组不变的情况下,foreach循环(6.2.7, P161 ),for each,for each循环用来依次处理数组或集合中的每个元素而不必为指定下标而分心,for(variable:集合) 循环体,语法,int a=2,3,3,4; for(int e : a) System.out.println(e);,示例,编写一个选择排序演示程序,该程序将一个一维整型数组按从小到大的顺序排序后输出 算法思想:假设待排序数组长度为n,则进行如下操作:第一次从数组里面找出最小的元素,放在第一个元素(下标为0)的位置;第二次从剩下的元素里面找出最小的元素,放在第二个元素(下标为1)的位置,依此类推,共执

23、行n趟。,/使用选择排序算法进行排序 for(int i = 0; i array.length; i+) for(int j = i+1; j array.length; j+) if(arrayj arrayi) /交换arrayj 与 arrayi的值 int temp = arrayj; arrayj = arrayi; arrayi = temp; ,数组的复制(6.5, P166 ),数组复制就是将一个数组的内容拷贝到另一个数组中,复制后应该有两个一模一样的数组: int source = 1,2,3,4,5 int target = source; / ?,数组的复制,数组复制有

24、三种方法: a. 利用循环语句逐个拷贝数组的每个元素 int source = 1,2,3,4,5 int target = new intsource.length; for(int i=0;isource.length;+i) targeti = sourcei;,数组的复制,b. System类的静态方法arraycopy: arraycopy(sourceArray, src_pos, targetArray, target_pos, length); sourceArray: 源数组 src_pos:源数组复制起始位置 targetArray:目标数组 target_pos:目标数组

25、存放起始位置 length:复制元素个数 eg:System.arraycopy(s,0,t,0,s.length);,数组的复制,c. 使用clone方法 int source = 1,2,3,4,5; int target = source.clone(); 注:调用clone方法要求数组的基本元素类型实现 Cloneable接口,多维数组,多维数组就是数组的数组,其数组基类型还是一个数组类型 如果一个数组的基类型是一维数组则该数组称为二维数组,如果一个数组的基类型为二维数组则该数组为三维数组,依此类推。 在多维数组中访问一个元素要用到不止一个数组下标。,多维数组,多维数组的声明 elem

26、entType arrayName; 同样的,定义三维数组的语法格式为: elementType arrayName; 一般把多维数组各维自左向右依次称为第一维,第二维,多维数组,创建多维数组也要用到new运算符: arrayName = new elementType DIMENSION_1_SIZEDIMENSION_2_SIZE; 其中: arrayName为二维数组的名字; elementType为数组的基类型,必须是声明 arrayName时指定的数组元素类型或其子类型; DIMENSION_1_SIZE和DIMENSION_2_SIZE分别指明数组各维的长度。,多维数组,一种简单的

27、声明、创建并初始化二维数组的方法:,60,int array = new int43; array00 = 1; array01 = 2; array02 = 3; array10 = 4; array11 = 5; array12 = 6; array20 = 7; array21 = 8; array22 = 9; array30 = 10; array31 = 11; array32 = 12;,int array = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ;,等价于,多维数组,多维数组元素的访问: arrayNamed1_indexd2_index

28、dn_index; 其中: arrayName为数组名字;n为数组的维数; d1_index、d2_index 、 dn_index均为整型变量,代表所要访问的元素在各维中的下标。,多维数组,多维数组的长度: int x = new int34;,62,多维数组,锯齿形数组 Java二维数组实际上数组的数组,作为数组基类型的数组可以是不同长度的,多维数组,二维数组的处理: 一般情况下使用二重for循环处理二维数组 for(int i=0;ia.length;+i) for(int j= 0; jai.length; +j) . ,程序设计例题,4. 编写函数求给定正整数的最大的数据位 5. 打

29、印所有三位的Armstrong数(数的数值与其各位数字立方和相等) 6. 打印所有除以11后所得的商正好是它各位数字平方和的三位数,相关知识点,Java运算符,运算符与表达式,7.食堂管理员带1000元钱去市场买鸡,市场价小鸡4元,公鸡12元,母鸡16元。该管理员打算正好买100只鸡,要求三种鸡都要买并尽量多买母鸡。编写程序,替他指定采购方案,8. 编写程序实现人机石头剪子布程序,相关知识点,Java常用类 Math,Math类(5.10, P137 ),Math是Java预定义的类(java.lang),该类定义了与数学运算相关操作的集合 类常量: PI E 类方法: 三角函数方法 取整方法

30、 min, max, abs, 和 random 方法等,三角函数方法,sin(double a) cos(double a) tan(double a) acos(double a) asin(double a) atan(double a),72,参数为弧度 角度与弧度的相互转化: toDegrees(Math .PI/2) toRadians(90),示例: Math.sin(0) returns 0.0 Math.sin(Math.PI / 6) returns 0.5 Math.sin(Math.PI / 2) returns 1.0 Math.cos(0) returns 1.0

31、Math.cos(Math.PI / 6) returns 0.866 Math.cos(Math.PI / 2) returns 0,指数方法,exp(double a) e的a次幂 log(double a) a的自然对数 log10(double a) 以10为底的a的对数 pow(double a, double b) a的b次幂. sqrt(double a) a的平方根,73,示例: Math.exp(1) returns 2.71 Math.log(2.71) returns 1.0 Math.pow(2, 3) returns 8.0 Math.pow(3, 2) return

32、s 9.0 Math.pow(3.5, 2.5) returns 22.91765 Math.sqrt(4) returns 2.0 Math.sqrt(10.5) returns 3.24,取整方法,double ceil(double x) 向上取整 double floor(double x) 向下取整 double rint(double x) 返回离x最近的整数; 如果两个整数离x距离相同,返回偶数 int round(float x) long round(double x) 四舍五入,74,示例,Math.ceil(2.1) returns 3.0 Math.ceil(2.0)

33、returns 2.0 Math.ceil(-2.0) returns 2.0 Math.ceil(-2.1) returns -2.0 Math.floor(2.1) returns 2.0 Math.floor(2.0) returns 2.0 Math.floor(-2.0) returns 2.0 Math.floor(-2.1) returns -3.0 Math.rint(2.1) returns 2.0 Math.rint(2.0) returns 2.0 Math.rint(-2.0) returns 2.0 Math.rint(-2.1) returns -2.0 Math.

34、rint(2.5) returns 2.0 Math.rint(-2.5) returns -2.0 Math.round(2.6f) returns 3 Math.round(2.0) returns 2 Math.round(-2.0f) returns -2 Math.round(-2.6) returns -3,75,min, max和 abs方法,max(a, b) min(a, b) 返回最大值或最小值 abs(a) 返回绝对值,76,Examples: Math.max(2, 3) returns 3 Math.max(2.5, 3) returns 3.0 Math.min(2

35、.5, 3.6) returns 2.5 Math.abs(-2) returns 2 Math.abs(-2.1) returns 2.1,random 方法,示例:,规律:,random() 返回0.0, 1.0)区间的任意数,9. 精确计算a*b,相关知识点,Java常用类 String,String类,为了表示字符串,在java.lang包中定义了类String用于表示不可变的字符串 为了提高效率、节约内存,Java对具有相同的字符序列的字符串直接量使用同一实例: String s1 = “hello” ; String s2 = “hello” ;,String 类的构造方法,Str

36、ing 类,字符串长度:length(),字符串,长度,由 length() 方法确定,语法,public int length();,返回字符串中的字符数,String 类,String name = “John Smith“; System.out.println (name.length();,String 类,String s1 = “hello”; / s1 = “hello”; ? String s2 = “hello”; / s1 = s2; ? String s3 = new String(“hello”); / s1 = s3 ? String s4 = new String

37、(“hello”); / s3 = s4 ?,字符串比较 =/equals(),字符串 1,字符串 2,字符串 1,字符串 2,由 equals() 方法确定,检查组成字符串内容的字符,同一个对象,用 = 运算符检查,检查字符串是否指向同一个或不同的对象,String 类,String 类,搜索字符串,86,字符串 1,情形 1:,indexOf(char) 方法 indexOf(String)方法 lastIndexOf方法,找到第一个匹配,索引,0 1 2 3,情形 2:,如果没有找到匹配,则返回 -1,返回找到的第一个匹配的位置索引,8.1.2 String 类,提取/拼接/替换/分隔字

38、符串,87,String 类,更改字符串中字符的大小写,88,Hello,使用 toUpperCase( ) 方法,HELLO,HELLO,使用 toLowerCase( ) 方法,hello,语法,public String toUpperCase();,语法,Public String toLowerCase();,String 类,String 类,字符串与数组间的转换,StringBuffer/StringBuilder 类,90,String类,创建后,直接修改,不变性的概念,解决方法,StringBuffer 类,String 的对等类,表示可增加和可编 写字符的可变序列,将字符插

39、入到字符串中间 或附加到字符串末尾,StringBuffer/StringBuilder 类,91,StringBuffer用于表示可以修改的字符串,可以替换String类使用,StringBuffer/StringBuilder 类,92,93,public class StringBuf /* 构造方法 */ protected StringBuf() public static void main(String args) StringBuffer buf = new StringBuffer(“Java“); buf.append(“ Guide Ver1/”); buf.append

40、(3); int index = 5; buf.insert(index, “Student “); index = 23; buf.setCharAt(index, .); int start = 24; int end = 25; buf.replace(start, end, “4“); String s = buf.toString(); / StringBuffer对象与String的转换 System.out.println(s); ,10. 百灯判熄 有100盏灯,编号1-100,分别对应100个控制开关。开始时全部开关朝上(表示开),然后进行以下操作:编号凡是1的倍数灯反向拨开

41、关一次,编号为2倍数的灯再反向拨一次, 问:最后有为熄灭状态灯的编号?,11. 公安人员审问四个偷窃嫌疑犯A、B、C、D A: 是B偷的,不是D偷的 B: 我没有偷,是C偷的 C: A没有偷,是B偷的 D: 我没有偷,我用的是我家里的 已确切地知道,四个人中只有一个是偷窃者。还知道四人说的话中要么全是实话,要么全是假话。请根据四个人的答话,判断谁是偷窃者,三种基本算法,递推 递归 迭代,递推法,递推法:递推法实际上是一种递推关系,就是为了得到问题的解,把它推到比原问题简单的问题求解,可分为: 顺推法 倒推法,递推(顺推),斐波那契兔子问题: 有一对小兔子,出生一个月后变大兔子开始怀孕;再过一个

42、月生出一对小兔子,这时共有两对兔子;同时大兔子再次怀孕;第三个月,以前出生的小兔子变成大兔子,以前怀孕的大兔子又生出一对小兔子,这时共有三对兔子(两对大兔子,一对小兔子),所有大兔子又都全部怀孕;第四个月,以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子,这时共有五对兔子(三对大兔子,两对小兔子),所有大兔子又都怀孕 假设在兔子生养过程中没有死亡,编程序,计算n个月后,有多少对兔子 F1 = 1; F2 = 1; Fn = Fn-1+Fn-2,递推(顺推),楼梯有24阶台阶,如果一步走1阶或2阶,试问有多少种走法? u1 = 1, u2 = 2; un = un-1+un-2,递

43、推,海盗分金块问题 10名海盗抢得了窖藏的100块金子,并打算瓜分这些战利品。他们的习惯是按下面的方式进行分配:最厉害的一名海盗提出分配方案,然后所有的海盗(包括提出方案者本人)就此方案进行表决。如果50%或更多的海盗赞同此方案,此方案就获得通过并据此分配战利品。否则提出方案的海盗将被扔到海里,然后下一名最厉害的海盗又重复上述过程。 他们是残忍的, 都乐于看到他们的一位同伙被扔进海里;他们是贪婪的,都千方百计多得一些金块然而他们是聪明的,而且知道其他的海盗也是聪明的。 这些金块不能再分,也不允许几名海盗共有金块,最凶的一名海盗应当提出什么样的分配方案才能使他获得最多的金子呢?,递推(逆推),六

44、个顾客买花。第一个买走全部的1/2加 1/2盆,第二个买走剩余的1/3加1/3盆 ,第三个买走剩下的1/4加1/4盆,第四个顾客买走剩余的1/5加1/5盆,第五个顾客买走剩余的1/6加1/6盆,第六个顾客一看还剩9盆,便全部买走。请问共有多少盆花? un-1 = (un+1/n)(n-1)/n,一个猴子摘了一堆桃子,第一天吃了一半零一个,第二天吃了剩余的一半零一个,第三天又吃了剩余的一半零一个,如此下去,第十天吃完后剩余一个桃子。编程求猴子最初摘了几个桃子,递归,汉诺塔问题:一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时

45、候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔庙宇和众生也都将同归于尽。,考虑一下把64片金片由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢? 这里需要递归的方法。假设有n片,移动次数是f(n).显然f=1,f=3,f=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2n-1。n=64时, f(64)= 264-1=1844

46、6744073709551615 假如每秒钟一次,共需多长时间呢?一个平年365天有 31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下, 18446744073709551615/31556952=584554049253.855年 这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。,相关知识点:,方法(第5章,P123),定义方法的动机,在程序编写过程中,存在这样一些操作,除了操作的数据不同外,其

47、它执行过程都是一样的 为了减少代码编写量、便于程序的维护,可以将这些代码放在一个位置方法 使用别人定义的功能,无需(无法)知道其具体的实现原理,只需按照要求传递参数即可 信息隐藏(黑盒),方法定义,方法:为了完成某个操作组织在一起的语句集合 定义方法的语法: 修饰符 返回值类型 方法名( 参数列表) 方法体 ,方法签名,方法签名:方法的标识,由方法名和参数列表组成,形式参数,形式参数:在方法头中定义的变量,实际参数,方法调用时,会传递一个值给参数,该值就会被实际参数引用,返回值类型,方法执行会返回一个值,返回值类型是该值的数据类型。如果该方法不返回任何值,则返回值类型使用关键字void声明,调用方法,使用方法的动作叫做调用(call/invoke): int larger = max(3,4); System.out.println(“hello world”);,调用方法,方法追踪,i为5,animation,方法追踪,j 的值为2,animation,方法追踪,116,调用 max(5, 2),animation,方法追踪,调用 max(i, j) i 值传递给 num1 j值传递给 num2,animation,方法追踪,声明变量res

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1