今天学习了方法的调用,一般的,在Java语言中,调用方法有三种方式。
单独调用,这种方式无法使用方法的返回值。格式:方法名称(参数值);
调用是show(1,5),这个show方法没有返回值,所以不能接收返回值,否则语法报错【int k=show(1,5);】;如果有返回值,可以不接受返回值
打印调用。这种方式可以将方法的返回值直接打印。格式:System.out.println(方法名称(参数值)); 注意使用sysout方法调用需要有返回值
赋值调用。这种方式可以将方法的返回值赋值给一个变量,注意变量的数据类型必须和方法的返回值类
型对应。格式:数据类型 变量名称= 方法名称(参数值)
重名问题
变量的名称是否可以与方法名称重名?可以。
两个不同的方法中,能否各自有一个重名的变量?可以,而且各个方法中的临时变量之间没有任何关系。
main方法中有2个临时变量begin和end,add方法中也有两个临时变量begin和end,这个方法中的临时变量没有任何关系,各自生存在不同的方法中。
参数传递
形式参数:在定义方法的时候,写在小括号之内的变量,就叫形式参数。实际上在方法定义中起到
占位符的作用,会在方法调用时被传递过来的实际值所替代
实际参数:在调用方法的时候,真正传入方法里的数据,叫做实际参数。
圆括号中的实参列表为调用方法时实际传入的实际参数,称为实参列表。声明方法时圆括号中的参数称为形式参数,形式参数和实际参数在数据类型和个数上一定要匹配
注意:调用方法时形式参数和实际参数的个数和顺序必须一致,数据类型也必须相同。
两条规则
对于基本类型来说,形式参数的操作【不会】影响实际参数。值是单向传递
对任何语言来说,方法或者函数解决了需要重复使用的代码的次数
递归调用
递归调用指在方法执行过程中允许出现直接或者间接的该方法本身的调用
计算阶乘5!
阶乘: 0!=1,n!=(n-1)!×n
斐波那契数列Fibonacci sequence,又称黄金分割数列,以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34…
public class Test05 {
public static void main(String[] args) {
12
递归调用比较符合正常人的思维方式,但是相当的浪费内存,所以如果能使用其他方式解决就不要使用
递归。
循环和递归对比:
递归:易于理解、速度慢、存储空间大
循环:不易于理解、速度快、存储空间小
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13... 求出这个数列的前20项之和
int months = 0;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("月份:");
String ss = sc.nextLine();
try {
months = Integer.parseInt(ss);
if (months > 0) break;
System.out.println("请重新输入月份数!");
} catch (Exception e) {
System.out.println("请输入合法的月份数!");
}
}
int num = tongji(months);
System.out.println(months + "月后的兔子数为:" + num);
}
public static int tongji(int months) {
if (months > 0) {
if (months == 1 || months == 2) return 1;
return tongji(months - 1) + tongji(months - 2);
}
return 0;
} }
递归调用比较符合正常人的思维方式,但是相当的浪费内存,所以如果能使用其他方式解决就不要使用递归。
循环和递归对比:
递归:易于理解、速度慢、存储空间大
循环:不易于理解、速度快、存储空间小
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13… 求出这个数列的前20项之和
public class Test06 {
public static void main(String[] args) {
double res = 0;
for (int i = 1; i <= 20; i++) {
res += 1. * diguiFenzi(i) / diguiFenmu(i);
}
System.out.println(res);
}
public static int diguiFenzi(int n) {
// 如果使用递归调用必须保证有退出递归的点,必须保证不断逼近退出的点
if (n == 1) return 2;
else if (n == 2) return 3;
else return diguiFenzi(n - 1) + diguiFenzi(n - 2);
}
public static int diguiFenmu(int n) {
if (n == 1 || n == 2) return n;
else return diguiFenmu(n - 1) + diguiFenmu(n - 2);
} }
递归调用的特征
Java语言支持方法的递归调用
使用递归调用时必须可以逐渐接近结束点,不能发散
递归调用比较符合正常人的思维方式,但是相当的浪费内存,所以如果能使用其他方式解决就不要使用递归