1、1 第第 4 章章 方法方法 Method4.1方法声明方法声明4.2方法调用方法调用4.3参数传递参数传递4.4递归递归课程教学重点之一课程教学重点之一2概念概念 方法方法(Method)l 这是这是Java的一种命名的一种命名l 和通常意义上的和通常意义上的“方法方法”不同不同l在其他语言中,叫做在其他语言中,叫做“子程序子程序”、“函数函数”l如:如:main()方法方法“方法方法”的定义的定义l完成特定功能的、相对独立的完成特定功能的、相对独立的程序段程序段“方法方法”的特点的特点l可以在不同的程序段中可以在不同的程序段中被多次调用被多次调用l 可增强程序结构的清晰度,可增强程序结构的
2、清晰度,提高编程效率提高编程效率 学习重点学习重点l方法的声明和调用方法的声明和调用3第一个例子第一个例子编程实现数学计算编程实现数学计算Y=(1,2,100)+(200,201,298)+(-1,-2 -99)+(51,52,199)如何实现如何实现?l使用使用4 个循环个循环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;
3、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次?次?The Result:433765第二种做法第二种做法6第二个例子第二个例子输入输入4个整数,求它们中的最大数。个整数,求它们中的最大数。实现途径实现途径l直接求解直接求解4个数的大小个数的大小l编写从两个数中找最大数的方法,再多次调用编写从两个数中找最大数的方法,再多次调用这个方法这个方法哪个更好?哪个更好?7第一种做法第一种
4、做法8第二种做法第二种做法9什么时候使用什么时候使用“方法方法”用户程序中经常重复的任务用户程序中经常重复的任务l用户自己编写用户自己编写“方法方法”代码代码常用的任务常用的任务由由Java提供提供l数学函数数学函数l输出操作输出操作(print、println)l字符串操作字符串操作l界面操作界面操作l104.1 方法声明方法声明方法的规则方法的规则l先声明,后使用先声明,后使用l只能在类只能在类(Class)中声明中声明方法声明的格式方法声明的格式修饰符修饰符 返回值类型返回值类型 方法名方法名(参数表参数表)变量声明变量声明 语句语句方法头方法头方法体方法体实现具体功实现具体功能能 re
5、turn 表达式;表达式;/返回方法的结果,返回方法的结果,终止方法的执行终止方法的执行 11方法声明格式的说明方法声明格式的说明修饰符:修饰符:static public private protected 返回值类型返回值类型l返回结果的数据类型,如:返回结果的数据类型,如:int、float、String等等 l无无返回值时用返回值时用void方法名:方法名:用户定义的标识符,要符合命名规则用户定义的标识符,要符合命名规则参数表:参数表:调用方法时,传递的参数及其数据类型调用方法时,传递的参数及其数据类型l相邻的两个参数之间用逗号隔开相邻的两个参数之间用逗号隔开 修饰符修饰符 返回值类型
6、返回值类型 方法名方法名(参数表参数表)变量声明变量声明 语句语句 12【例【例4-1】计算平方值的方法】计算平方值的方法static int square(int x)int s;s=x*x;return s;类型修饰符类型修饰符方法名方法名参数参数方法体方法体变量声明变量声明语句语句返回语句返回语句方法头方法头返回值类型返回值类型134.2 方法调用方法调用方法定义方法定义 执行方法执行方法 调用方法调用方法调用格式一调用格式一l方法表达式方法表达式方法名方法名(实际参数表实际参数表)l有返回值有返回值的方法,可作为一个的方法,可作为一个表达式表达式或者一个具体或者一个具体的的数值数值来使
7、用来使用l如:如:y=square(20);14实际参数实际参数 n形式参数形式参数 x参数传递参数传递【例【例4-2】以方法表达式方式调用方法以方法表达式方式调用方法注意:实参的个数、顺序、类型要和实参一一对应注意:实参的个数、顺序、类型要和实参一一对应15方法语句方法语句调用格式二调用格式二l方法语句方法语句 方法名方法名(实际参数表实际参数表);l无返回值的方法,以独立语句的形式调用无返回值的方法,以独立语句的形式调用l方法前面的类型修饰符为方法前面的类型修饰符为 void 16【例【例4-3】以方法语句方式调用方法以方法语句方式调用方法方法语句方法语句17【例【例4-4】无参方法】无参
8、方法有些方法没有输入参数有些方法没有输入参数18第第4 章习题章习题 2编写两个方法,分别求两个整数的最大公约数编写两个方法,分别求两个整数的最大公约数和最小公倍数。和最小公倍数。求最大公约数求最大公约数可用可用辗转相除法辗转相除法欧几里得算法欧几里得算法(1)a 除以除以b,得余数为,得余数为r(2)若若r0,则,则 b 为最大公约数为最大公约数 若若r0,则,则 b 赋值给赋值给 a,r 赋值给赋值给 b,继续以上步骤,继续以上步骤(3)经过有限步后,经过有限步后,r=0最小公倍数最小公倍数为为a*b/最大公约数最大公约数a b r9 6 36 3 0r=a%b19第第4 章习题章习题 2
9、 程序一程序一 20第第4 章习题章习题 2 程序二程序二 输入:输入:8 6最大公约数是最大公约数是 2最小公倍数是最小公倍数是 24输入:输入:5 3无最大公约数无最大公约数最小公倍数是最小公倍数是 15输入:输入:675 351最大公约数是最大公约数是 27最小公倍数是最小公倍数是 877521第第4 章习题章习题 6编写方法,判断一个三位数是否是水仙花数编写方法,判断一个三位数是否是水仙花数方法的返回值方法的返回值ltrue是水仙花数是水仙花数lfalse不是水仙花数不是水仙花数static boolean isNarcissus(int n)int a,b,c;a=n/100;b=n
10、/10%10;c=n%10;if(n=a*a*a+b*b*b+c*c*c)return true;elsereturn false;22第第4 章习题章习题 6 程序程序234.3 参数传递参数传递 参数传递规则参数传递规则l调用带参数的方法时,必须提供实参调用带参数的方法时,必须提供实参 l实参实参 形参形参,称为,称为参数传递参数传递 l被调用的被调用的 方法用实参执行方法体方法用实参执行方法体 l实参可以是常量、变量、表达式实参可以是常量、变量、表达式l所有类型的参数传递都是所有类型的参数传递都是“值传递值传递”u调用时把实参的值传递给形参调用时把实参的值传递给形参问题问题l如果形参变了
11、,实参会变吗?如果形参变了,实参会变吗?24【例【例4-5】交换两个变量的值】交换两个变量的值运行结果运行结果调用前:调用前:u=23 v=10交换前:交换前:x=23 y=10交换后:交换后:x=10 y=23调用后:调用后:u=23 v=1025【例【例4-5】值传递的例子】值传递的例子运行的结果运行的结果调用前:调用前:u=23 v=10交换前:交换前:x=23 y=10交换后:交换后:x=10 y=23调用后:调用后:u=23 v=10说明说明l参数传递:参数传递:u x;v yl调用前后:调用前后:u、v 的值没有变的值没有变l交换前后:交换前后:x、y的值改变了的值改变了264.4
12、 递归递归用自身的结构来描述自身用自身的结构来描述自身典型例子典型例子阶乘运算阶乘运算递归就是自己调用自己递归就是自己调用自己27【例【例4-6】采用递归算法求】采用递归算法求n!求求n!的算法的算法l n!=n(n-1)!l(n-1)!=(n-1)(n-2)!l(n-2)!=(n-2)(n-3)!l l 2!=21!l 1!=1递归定义递归定义 fac(n)=n!lfac(n)=n*fac(n-1)lfac(n)=1 当当n=1时时static long fac(int n)if(n=1)return 1;elsereturn n*fac(n-1);28【例【例4-6】程序】程序29Fact
13、orial(0)1Factorial(5)5Factorial(4)Factorial(4)4Factorial(3)Factorial(1)1Factorial(0)Factorial(2)2Factorial(1)Factorial(3)3Factorial(2)Factorial(5)5 24Factorial(4)4 6Factorial(3)3 2Factorial(2)2 1Factorial(1)1 1递归实现过程递归实现过程递推和回推递推和回推facfac(5)=5 fac(4)facfacfacfacfacfacfac(1)fac(4)=4 fac(3)fac(3)=3 fa
14、c(2)fac(2)=2 fac(1)30非递归算法求非递归算法求n!static long fac(int n)long f=1;for(int i=1;i+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)直接把金片直接把金片AB else hanio(n-1个金片个金片,AC)把把n号金片号金片AB hanio(n-1个金片个金片,CB)38【例【例4-7】汉诺塔(】汉诺塔(Hanoi)问题问题39【例【例4-7】汉诺塔(】汉诺塔(Ha
15、noi)问题问题 P.5340【例【例4-7】汉诺塔(】汉诺塔(Hanoi)问题问题金片为金片为3个个,需,需7步步完成完成金片为金片为64个个,需,需264-1步完成步完成l若每秒若每秒1步,需步,需58万亿年万亿年l若计算机每秒运算若计算机每秒运算100万次,需万次,需5800万年万年运行结果:运行结果:The steps for 3 disk are:A-BA-CB-CA-BC-AC-BA-B41【例】十进制整数转换成二进制数【例】十进制整数转换成二进制数设计方法,实现十进制整数转换成二进制设计方法,实现十进制整数转换成二进制l除除2 取余法取余法如如:35 的二进制值为的二进制值为 1
16、00011 2 35 2 17 1 2 8 1 2 4 0 2 2 0 2 1 0 2 0 1nn%2 tn/2nn=0时停止时停止即即n0时重复时重复字符串字符串 ss 初值为初值为s=t+sstatic 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【例】十进制整数转换成二进制数【
17、例】十进制整数转换成二进制数考虑十进制整数有负数的情况考虑十进制整数有负数的情况l如如:-35 的二进制值为的二进制值为-100011static String dectobin(int n)int t;/保存某位二进制保存某位二进制 String s=;/保存二进制数保存二进制数 do t=n%2;/获得除获得除2后的余数后的余数 s=t+s;/拼接拼接 n=n/2;/获得除获得除2后的商后的商 while(n0);return s;44import java.util.*;public class T1 static String dTob(int n)String s;if(n0)s=-
18、+dTob(-n);else if(n2)s=+(char)(n+(int)(0);else s=dTob(n/2)+(char)(n%2+(int)0);return s;【例】十进制整数转换成二进制数【例】十进制整数转换成二进制数递归方法递归方法45Review:about MethodMethod(方法方法)相当于相当于函数函数或或子程序子程序编写编写Method(方法方法)l方法类型(返回值),方法名,形式参数方法类型(返回值),方法名,形式参数l在在 class(类类)中编写中编写l不能嵌套不能嵌套调用调用Method(方法方法)l格式格式u方法表达式:方法有返回值方法表达式:方法有返回值u方法语句:方法没有返回值(方法语句:方法没有返回值(void)l在在Main方法方法中调用中调用l也可在也可在Method(方法方法)中调用中调用递归递归46Review:about Method要求要求l能解读能解读“方法方法”的程序代码的程序代码l能编写简单的能编写简单的“方法方法”常用的方法常用的方法(自定义)(自定义)l水仙花数水仙花数lFibonacci数列数列l计算阶乘计算阶乘l求阶乘之和求阶乘之和l计算多项式计算多项式例如第例如第4章习题章习题3l计算公约数、公倍数计算公约数、公倍数l判断素数判断素数