函数(方法)
方法可以用于定义可重用的代码以及组织和简化编码。
定义函数
函数的定义由方法名称、参数、返回值类型以及函数体组成。
定义函数的语法如下所示:
修饰符 返回值类型 函数名( 参数列表 )
{ // 函数体;
}
方法头 是指方法的修饰符、返回值类型、方法名 和方法的参数。本章的所有方法都使用静态修饰 符 static, 方法可以返回一个值。retumValiieType 是方法返回值的数据类型。有些方法只是完成 某些要求的操作,而不返回值。在这种情况下,retuniValueType 为关键字 void。例如:在 main 方法中 returnValueType 就是 void, 在 System.exit、System.out.print*ln方法中返回 值类型也是如此。如果方法有返回值,则称为带返回值的方法, 否 则就称这个该方法为 void 方法。
定义在方法头中的变量称为形式参教(formal parameter)或者简称为形麥(parameter)。 参数就像占位符。当调用方法时,就给参数传递一个值,这个值称为实际参數(actual parameter)或实参(argument)。参数列表(parameter list)指明方法中参数的类型、顺序和 个数。方法名和参数列表一起构成方法签名(method signature)。参数是可选的,也就是说, 方法可以不包含参数。例如:Math.randomO 方法就没有参数。 方法体中包含一个执行方法的语句集合。max 方法的方法体使用一个if语句来判断哪个 数较大,然后返回该数的值。为使带返回值的方法能返回一个结果,必须要使用带关键字 return 的返回语句。执行 return 语句时方法终止。
调用函数
函数的调用是执行函数中的代码。
当程序调用一个方法时,程序控制就转移到被调用的方法。当执行完 return 语句或执 行到表示方法结束的右括号时,被调用的方法将程序控制返还给调用者。
- 注意:对带返回值的方法而言,return 语句是必需的。
每当调用一个方法时,系统会创建一个活动记录(也称为活动框架),用于保存方法中 的参数和变量。活动记录置于一个内存区域中,称为调用堆栈(call stack)。调用堆栈也称 为执行堆栈、运行时堆栈,或者一个机器堆栈,常简称为 “堆栈”。当一个方法调用另一个 方法时,调用者的活动记录保持不动,一个新的活动记录被创建用于被调用的新方法。 T-个方法结束返回到调用者时 ,其相应的活动记录也被释放。
函数的重载
重栽函数使得你可以使用同样的名字来定义不同函数,只要它们的签名是不 同的。
注意:
- 重栽方法可以使得程序更加清楚,以及更加具有可读性。执行同样功能但是具有不 同参数类型的方法应该使用同样的名字。
- 被重栽的方法必须具有不同的参数列表。不能基于不同修饰符或返田值类型来重栽 方法。
- 有时调用一个方法时,会有两个或更多可能的匹配,但是,编译器无法判断哪个是 最精肩的匹配。这称为歧义调用。
下面我们基于函数的定义与调用,来解这两道题:
class Class25{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个整数:");//提示用户输出
long num=scanner.nextLong();
System.out.println(sumDigits(num));
}
public static int sumDigits(long n){
int sum=0;
while(true){
sum+=n%10;//数字本身对10取余并相加
n=n/10;//自除10
if(n==0){
break;
}
}
return sum;
}
}
运行结果为:
class Class26{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
if(isPalindrome(num)){
System.out.println("是回文!");
}else{
System.out.println("不是回文!");
}
}
public static int reverse(int num){
int revnum=0;
while(true){
revnum=revnum*10+num%10;
num/=10;
if(num==0){
break;
}
}
return revnum;
}
public static boolean isPalindrome(int num){
int revnum=reverse(num);
if(revnum==num){
return true;
}else{
return false;
}
}
}
运行结果为:
函数的递归
概念:递归:程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
示例:汉诺塔问题:有三根柱子A,B,C,其中A上面有n个圆盘,从上至下圆盘逐渐增大,每次只能移动一个圆盘,并且规定大的圆盘不能叠放在小的圆盘上面,现在想要把A上面的n个圆盘全部都移动到C上面,输出移动的总步数以及移动的过程。
具体代码实现:
class Hanno{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入盘子的个数:");
int level=scanner.nextInt();
move("x","y","z",level);
}
public static void move(String from,String mid,String to,int level){
if(level==1){
System.out.println(from+"->"+to);
}else{
move(from,to,mid,level-1);
System.out.println(from+"->"+mid);
move(mid,from,to,level-1);
}
}
}
运行结果: