1.函数(方法)
定义:主要用于封装具有独立功能的一段代码,由函数名称。修饰符、返回值类型、参数列表和方法体构成
语法格式如下:
修饰符 类型修饰符 返回值类型 函数名(参数列表){
函数体
return 返回值;
}
权限修饰符:标记谁能用,谁不能用 public protected 默认 private
类型修饰符:标记函数的一些特殊含义 static 默认 native synchronized
函数名:给该段代码起名称
参数列表:用于接收调用者传递进来的数据 以便函数内部使用
(参数类型1 形参1,参数类型2 形参2....)
参数列表 可有可无
函数体:就是你所封装的那个具有独立功能的那段代码
return:仅仅表示结束当前函数(函数弹栈)
如果函数有返回值 则return必须写出来
如果函数没有返回值,则return可以不明显的写出来 但是一定存在(隐藏)
返回值:这段代码计算的结果 结果可有可无
返回值类型:就是返回值是的数据类型(兼容即可)
如果没有返回值 则返回值类型写void
我们来看一下一个函数的定义,该函数找出两个整数中哪个数比较大。这个名为 max 的方法有两个 int 型参数:numl 和 mum2, 函数返回两个数中较大的一个。下图就很详细解释了函数的组成
注意: 在方法头中,需要对每一个参数进行独立的数据类型声明。例如:max(int num1,int num2)是正确的,而 max(int num1,num2)是错误的。
方法能够带来代码的共享和重用。
对带返回值的方法而言,return 语句是必需的。下面代码中显示的方法在逻辑上是正确的,但它会有编译错误,因为 Java 编译器认为该方法有可能不会返回任何值。
public static int sum(int a,int b){
int sum = a+b;
}
void 方法不需要 return 语句,但它能用于终止方法并返回到方法的调用者。使用 return;
案例:
代码如下:
import java.util.Scanner;
class Class25{
public static void main(String args[]){
System.out.print("请输入一个整数:");
Scanner Sc = new Scanner(System.in);
long num = Sc.nextInt();
long sum = sumDigits(num);
System.out.println("的各位数字之和为"+sum);
}
public static long sumDigits(long n){
long sum = 0;
while(true){
long a=n%10;
n = n/10;
sum = sum+a;
if(n==0){
break;
}
}
return sum;
}
}
2、函数重载:重载函数使得你可以使用同样的名字来定义不同函数。
好处:函数重载可以使得程序更加清楚,以及更加具有可读性。执行同样功能但是具有不同参数类型的方法应该使用同样的 名字。
对函数的参数进行拓展。
判断函数到底是不是重载:看参数类型的排列组合(个数,顺序)。
public static int max(1nt numl, int num2){
}
public static double max(double numl, double num2){
}
public static double max(double numl, double num2 ,double num3){
}
注意事项:被重载的方法必须具有不同的参数列表。不能基于不同修饰符或返回值类型来重载函数
有时调用一个方法时,会有两个或更多可能的匹配,但是,编译器无法判断哪个是最精肩的匹配。这称为歧义调 用( ambiguous invocation)。歧义调用会产生一个编译错误。
案例:求数的最大值
代码如下:
class Class01{
public static void main(String args[]){
System.out.println(max(3,4)); //
System.out.println(max(3.0,4.5)); //
System.out.println(max(3.0,4.5,6.5)); //
}
public static int max(1nt numl, int num2){ // 两个整形比大小
if (numl > num2){
return numl;
}else{
return num2;
}
}
public static double max(double numl, double num2){ //两个double比大小
if (numl > num2){
return numl;
}else{
return num2;
}
}
public static double max(double numl, double num2 ,double num3){ //三个double比大小
return max(max(numl, num2), num3);
}
}
3、函数递归:从代码上来看 就是函数调用函数自己。
递归的好处:递归主要是将大的问题逐步化解为小的问题进而解决,减少代码量。通常,递归用于解决本质上有递归特性的问題,例如汉诺塔问題,及思瑞平斯基三角形。
递归的坏处:递归程序可能会用完内存,引起一个 StackOverflowError 错误。
注意:写递归时一定要清楚合适归(递归到那一层结束)
递归练习:
1.利用递归求解:1+2+3+4+.........+n的总和
import java.util.Scanner;
class Home01{
public static void main(String args[]){
Scanner Sc = new Scanner(System.in);
System.out.print("请输入一个数字:"); //提示用户输入一个数字
int num = Sc.nextInt();
System.out.print("1到"+num+"的总和为"+sum(num)); //调用函数sum求1到num之和
}
public static int sum(int num){
if(num == 1){ //当num==1时递归结束
return 1;
}
return sum(num-1)+num; //调用自己
}
}
2.打印斐波那契数列前20项:1 ,1 ,2 ,3, 5 ,8 ,13,21 。。。。。。
class Demo01{
public static void main(String[] args){
for(int i=1;i<=20;i++){ //for循环打印出前10项斐波那契数列
System.out.print(fib(i)+" "); //求第i项
}
}
//此函数求得只是第n项的值
public static int fib(int n){
if(n==1||n==2){
return 1;
}
return fib(n-1)+fib(n-2);
}
}
如图给出了计算fib(4)时对fib进行的递归调用:
3.汉诺塔问題
import java.util.Scanner;
class Demo01{
public static void main(String args[]){
Scanner Sc = new Scanner(System.in);
System.out.print("请输入盘子的数量:"); //输入盘子的数量
int num = Sc.nextInt();
HanLuo("x","y","z",num); //托板为x ,y ,z
}
public static void HanLuo(String from,String mid ,String to,int num ){
if(num==1){ //递归结束条件
System.out.println(from+"到"+to); //直接输出从from到to
}else{
HanLuo(from,to,mid,num-1); // 将前n-1个盘子从from移到mid 借助to
System.out.println(from+"到"+to); //直接输出从from到to
HanLuo(mid,from,to,num-1); //将前n-1个盘子从mid移到to 借助from
}
}
}