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 个循环,4
2、,第一种做法,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); ,编写一个累加的“子程序”,然后调用4次?,T
3、he Result: 43376,5,第二种做法,6,第二个例子,输入4个整数,求它们中的最大数。 实现途径 直接求解4个数的大小 编写从两个数中找最大数的方法,再多次调用这个方法哪个更好?,7,第一种做法,8,第二种做法,9,什么时候使用“方法”,用户程序中经常重复的任务 用户自己编写“方法”代码 常用的任务由Java提供 数学函数 输出操作( print、println ) 字符串操作 界面操作 ,10,4.1 方法声明,方法的规则 先声明,后使用 只能在类(Class)中声明 方法声明的格式修饰符 返回值类型 方法名( 参数表 )变量声明语句,方法头,方法体 实现具体功能,return
4、表达式; /返回方法的结果,终止方法的执行,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】无参方法,有些方法没有输入参数,18,第4 章习题 2,编写两个方法,分别求
6、两个整数的最大公约数和最小公倍数。 求最大公约数可用辗转相除法 欧几里得算法 (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 最小公倍数是 8775,21,第4 章习题 6,编写方法,判断一个
7、三位数是否是水仙花数 方法的返回值 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;elsereturn 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】采用递归算法求n!,求n! 的算法n! = n(n-1)! (n-1)
9、! = (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;elsereturn 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),fac(3)=3 fac(2),fac(2)=2 fac(1),30,非递
10、归算法求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;elsereturn n*fac(n-1); ,与递归算法比较,31,递归程序设计的规范,递归的两个要素 递归公式 找出前后项之间的关系 递归出口 递归终止条件 第一项的值,32,递归程序设计例子一,例:递归计算 s =1+2+3+4+100 递归公式s(n) = s(n-1)+n 递归出口s(0)=0,static int s(int n) i
11、f(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)问题,据古印度神话,在贝拿勒斯的圣庙里安放着一块铜板,板上有3根宝石针。梵天(印度教的主神)在创造世界的时候,在其中的一根针上摆放了
12、由小到大共64片中间有空的金片。无论白天和黑夜,都有一位僧侣负责移动这些金片。移动金片的规则是:一次只能将一个金片移动到另一根针上,并且在任何时候以及任意一根针上,小片只能在大片的上面。当64个金片全部由最初的那根针上移动到另一根针上时,这世界就在一声霹雳中消失。,35,【例4-7】汉诺塔(Hanoi)问题,将64 个金片从杆A搬到杆B 一次只能搬一个金片 金片只能插在A、B、C三个杆中 大片不能压在小片上,A B C,36,算法,hanio(n个金片,AB) / C为过渡 hanio(n-1个金片,AC) / B为过渡把n号金片ABhanio(n-1个金片,CB) / A为过渡 ,A (n个
13、金片) 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 (n = 1) 直接把金片ABelse hanio(n-1个金片, AC)把n号金片ABhanio(n-1个金
14、片, 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: AB AC BC AB CA CB AB,41,【例】十进制整数转换成二进制数,设计方法,实现十进制整数转换成二进制 除2 取余法 如:35 的二进制值为 100011,n,n%2 t,n/2n,n=0时停止 即n0时重复,字符串 s,s 初值为“
15、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
16、; /拼接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)0);return s; ,【例】十进制整数转换成二进制数,递归方法,45,Review: about Method,Method (方法) 相当于函数或子程序 编写Method (方法) 方法类型(返回值),方法名,形式参数 在 class (类) 中编写 不能嵌套 调用Method (方法) 格式 方法表达式:方法有返回值 方法语句:方法没有返回值(void) 在Main方法中调用 也可在Method (方法) 中调用递归,46,Review: about Method,要求 能解读“方法”的程序代码 能编写简单的“方法” 常用的方法(自定义) 水仙花数 Fibonacci数列 计算阶乘 求阶乘之和 计算多项式例如第4章习题3 计算公约数、公倍数 判断素数,