浙大 Java语言程序设计 第四讲.ppt

上传人:bao****ty 文档编号:144344196 上传时间:2020-09-07 格式:PPT 页数:46 大小:888KB
返回 下载 相关 举报
浙大 Java语言程序设计 第四讲.ppt_第1页
第1页 / 共46页
浙大 Java语言程序设计 第四讲.ppt_第2页
第2页 / 共46页
浙大 Java语言程序设计 第四讲.ppt_第3页
第3页 / 共46页
浙大 Java语言程序设计 第四讲.ppt_第4页
第4页 / 共46页
浙大 Java语言程序设计 第四讲.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《浙大 Java语言程序设计 第四讲.ppt》由会员分享,可在线阅读,更多相关《浙大 Java语言程序设计 第四讲.ppt(46页珍藏版)》请在金锄头文库上搜索。

1、1,第 4 章 方法 Method,4.1方法声明 4.2方法调用 4.3参数传递 4.4递归 课程教学重点之一,2,概念,方法( Method ) 这是Java的一种命名 和通常意义上的“方法”不同 在其他语言中,叫做“子程序”、“函数” 如:main( )方法 “方法”的定义 完成特定功能的、相对独立的程序段 “方法”的特点 可以在不同的程序段中被多次调用 可增强程序结构的清晰度,提高编程效率 学习重点 方法的声明和调用,3,第一个例子,编程实现数学计算 Y=(1, 2, 100) +(200,201, 298) +(-1,-2 -99) +(51,52, 199) 如何实现? 使用4 个

2、循环,4,第一种做法,public class Sum4_1 public static void main(String args) int i, y=0; for( i=1; i=100; i+) /(1,2, 100) y=y+i; for( i=200; i=298; i+) /+(200,201,298) y=y+i; for( i=-99; i=-1; i+) /+(-1,-3,-99) y=y+i; for( i=51; i=199; i+) /+(51,52,199) y=y+i; System.out.println(The Rusult: +y); ,编写一个累加的“子程序

3、”,然后调用4次?,The Result: 43376,5,第二种做法,6,第二个例子,输入4个整数,求它们中的最大数。 实现途径 直接求解4个数的大小 编写从两个数中找最大数的方法,再多次调用这个方法 哪个更好?,7,第一种做法,8,第二种做法,9,什么时候使用“方法”,用户程序中经常重复的任务 用户自己编写“方法”代码 常用的任务由Java提供 数学函数 输出操作( print、println ) 字符串操作 界面操作 ,10,4.1 方法声明,方法的规则 先声明,后使用 只能在类(Class)中声明 方法声明的格式 修饰符 返回值类型 方法名( 参数表 ) 变量声明 语句 ,方法头,方法

4、体 实现具体功能,return 表达式; /返回方法的结果, 终止方法的执行,11,方法声明格式的说明,修饰符:static public private protected 返回值类型 返回结果的数据类型,如:int、float、String等 无返回值时用void 方法名: 用户定义的标识符,要符合命名规则 参数表: 调用方法时,传递的参数及其数据类型 相邻的两个参数之间用逗号隔开,修饰符 返回值类型 方法名(参数表) 变量声明 语句 ,12,【例4-1】计算平方值的方法,static int square(int x) int s; s=x*x; return s; ,类型修饰符,方法名

5、,参数,变量声明,语句,返回语句,方法头,13,4.2 方法调用,方法定义 执行方法 调用方法 调用格式一 方法表达式 方法名( 实际参数表 ) 有返回值的方法,可作为一个表达式或者一个具体的数值来使用 如:y = square(20);,14,实际参数 n,形式参数 x,【例4-2】 以方法表达式方式调用方法,注意:实参的个数、顺序、类型要和实参一一对应,15,方法语句,调用格式二 方法语句 方法名( 实际参数表 ); 无返回值的方法,以独立语句的形式调用 方法前面的类型修饰符为 void,16,【例4-3】 以方法语句方式调用方法,方法语句,17,【例4-4】无参方法,有些方法没有输入参数

6、,18,第4 章习题 2,编写两个方法,分别求两个整数的最大公约数和最小公倍数。 求最大公约数可用辗转相除法 欧几里得算法 (1) a 除以b,得余数为r (2) 若r0,则 b 为最大公约数 若r0,则 b 赋值给 a,r 赋值给 b,继续以上步骤 (3) 经过有限步后,r = 0 最小公倍数为a*b/最大公约数,a b r 9 6 3 6 3 0 r = a % b,19,第4 章习题 2 程序一,20,第4 章习题 2 程序二,输入: 8 6 最大公约数是 2 最小公倍数是 24 输入: 5 3 无最大公约数 最小公倍数是 15 输入: 675 351 最大公约数是 27 最小公倍数是

7、8775,21,第4 章习题 6,编写方法,判断一个三位数是否是水仙花数 方法的返回值 true是水仙花数 false不是水仙花数,static boolean isNarcissus(int n) int a, b, c; a=n/100; b=n/10%10; c=n%10; if(n=a*a*a+b*b*b+c*c*c) return true; else return false; ,22,第4 章习题 6 程序,23,4.3 参数传递,参数传递规则 调用带参数的方法时,必须提供实参 实参 形参,称为参数传递 被调用的 方法用实参执行方法体 实参可以是常量、变量、表达式 所有类型的参数

8、传递都是“值传递” 调用时把实参的值传递给形参 问题 如果形参变了,实参会变吗?,24,【例4-5】交换两个变量的值,运行结果 调用前:u=23 v=10,交换前:x=23 y=10 交换后:x=10 y=23 调用后:u=23 v=10,25,【例4-5】值传递的例子,运行的结果 调用前:u=23 v=10 交换前:x=23 y=10 交换后:x=10 y=23 调用后:u=23 v=10 说明 参数传递: u x ;v y 调用前后:u、v 的值没有变 交换前后:x、y的值改变了,26,4.4 递归,用自身的结构来描述自身 典型例子阶乘运算 递归就是自己调用自己,27,【例4-6】采用递归

9、算法求n!,求n! 的算法 n! = n(n-1)! (n-1)! = (n-1)(n-2)! (n-2)! = (n-2)(n-3)! 2! = 21! 1! = 1,递归定义 fac(n) = n! fac(n) = n* fac(n-1) fac(n)=1 当n=1时,static long fac(int n) if(n=1) return 1; else return n*fac(n-1); ,28,【例4-6】程序,29,递归实现过程递推和回推,fac,fac(5)=5 fac(4),fac,fac,fac,fac,fac,fac,fac (1),fac(4)=4 fac(3),f

10、ac(3)=3 fac(2),fac(2)=2 fac(1),30,非递归算法求n!,static long fac(int n) long f=1; for (int i=1;i=n;i+) f=f*i; return f; ,使用循环结构计算阶乘,static long fac(int n) if(n=1) return 1; else return n*fac(n-1); ,与递归算法比较,31,递归程序设计的规范,递归的两个要素 递归公式 找出前后项之间的关系 递归出口 递归终止条件 第一项的值,32,递归程序设计例子一,例:递归计算 s =1+2+3+4+100 递归公式 s(n)

11、= s(n-1)+n 递归出口 s(0)=0,static int s(int n) if(n=0) return 0; else return s(n-1)+n; ,return (n=0)? 0: s(n-1)+n;,33,递归程序设计例子二,例:求 Fibonacci 数列中的前20项 递归公式 f(n) = f(n-1)+f(n-2) 递归出口 f(1)=1 ,f(2)=1,static int f(int n) if(n=1|n=2) return 1; else return f(n-1)+f(n-2); ,34,【例4-7】汉诺塔(Hanoi)问题,据古印度神话,在贝拿勒斯的圣庙

12、里安放着一块铜板,板上有3根宝石针。梵天(印度教的主神)在创造世界的时候,在其中的一根针上摆放了由小到大共64片中间有空的金片。无论白天和黑夜,都有一位僧侣负责移动这些金片。移动金片的规则是:一次只能将一个金片移动到另一根针上,并且在任何时候以及任意一根针上,小片只能在大片的上面。当64个金片全部由最初的那根针上移动到另一根针上时,这世界就在一声霹雳中消失。,35,【例4-7】汉诺塔(Hanoi)问题,将64 个金片从杆A搬到杆B 一次只能搬一个金片 金片只能插在A、B、C三个杆中 大片不能压在小片上,A B C,36,算法,hanio(n个金片,AB) / C为过渡 hanio(n-1个金片

13、,AC) / B为过渡 把n号金片AB hanio(n-1个金片,CB) / A为过渡 ,A (n个金片) B C,if (n = 1) 直接把金片AB else ,37,方法,/* 搬动n个金片,从a到b,c为中间过渡 */ static void hanio(int n, char a, char b, char c) if (n=1) System.out.println(a+-+b); else hanio(n-1, a, c, b); System.out.println(a+-+b); hanio(n-1, c, b, a); ,hanio(n个金片,AB) / C为过渡 if (

14、n = 1) 直接把金片AB else hanio(n-1个金片, AC) 把n号金片AB hanio(n-1个金片, CB) ,38,【例4-7】汉诺塔(Hanoi)问题,39,【例4-7】汉诺塔(Hanoi)问题 P.53,40,【例4-7】汉诺塔(Hanoi)问题,金片为3个,需7步完成 金片为64个,需264-1步完成 若每秒1步,需58万亿年 若计算机每秒运算100万次,需5800万年,运行结果: The steps for 3 disk are: A-B A-C B-C A-B C-A C-B A-B,41,【例】十进制整数转换成二进制数,设计方法,实现十进制整数转换成二进制 除2

15、 取余法 如:35 的二进制值为 100011,n,n%2 t,n/2n,n=0时停止 即n0时重复,字符串 s,s 初值为 s = t + s,static String dectobin(int n) int t; /保存某位二进制 String s=; /保存二进制数 do t=n%2; /获得除2后的余数 s=t+s; /拼接 n=n/2; /获得除2后的商 while(n0); return s; ,42,【例】十进制整数转换成二进制数,43,【例】十进制整数转换成二进制数,考虑十进制整数有负数的情况 如:-35 的二进制值为 -100011,static String dectobin(int n) int t; /保存某位二进制 String s=; /保存二进制数 do t=n%2; /获得除2后的余数 s=t+s; /拼接 n=n/2; /获得除2后的商 while(n0); return s; ,44,import java.util.*; public class T1 static String dTob(int n) String s; if(n0) s=-+dTob(-n); else if(n2) s=+(char)(n+(int)(0); else s=dTob(n/2)+(char)(n%2+(int)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号