函数的概念、形参和实参、返回值和return关键字、递归和递归的应用
5.函数
5.1 函数的定义
5.1.1 函数的概念
- 实现特点功能的一段代码,可反复使用;
- 定义语法:
public static void 函数名称(){
//函数主题
}
- 经验:
将需要再多个位置重复使用的一组代码,定义在函数内;
5.1.2 定义函数
- 定义的的位置:
函数定义在类的内部,与main函数并列;
//位置1
public class TestDefinitionFunction{
//位置2
public static void main(String[] args){
//位置3
}
//位置4
}
//位置5
//正确位置:位置2、位置4
5.1.3 函数的调用
- 在需要执行函数代码的位置,通过函数名称进行调用;
- 注意:
调用函数时,会优先执行函数内部代码,结束后,返回到函数调用处,继续向下执行;
5.2 参数
5.2.1 函数的参数
- 多数情况下,函数与调用者之间需要数据的交互;
- 调用者必须提供必要的数据,才能使函数完成相应的功能;
- 调用函数时,所传入的数据被称为“参数”;
5.2.3 形参与实参
- 定义语法:
public static void 函数名称(形式参数){
//函数主体
}
- 经验:
“形参”等价于“局部变量的声明” - 调用语法:
函数名称 (实际参数);
- 经验:
“实参”等价于“局部变量的赋值”
5.2.4 单个函数
public class TestFunction2{
public static void main(String[] args){
System.out.println("床前明月光,");
System.out.println("-----------"); //普通方法打印
System.out.println("疑是地上霜。");
printSign(11); //调用函数打印
System.out.println("举头望明月,");
printSign(12);
System.out.println("低头思故乡。");
printSign(13);
}
//定义函数(打印符号),定义形式参数
public static void printSign(int count ){
for(int i = 1;i <= count;i++){
System.out.print("-");
}
System.out.println();
}
}
- 实际参数:10
调用带参数函数时,必须传入实际参数,为形式参数赋值; - 形式参数:int count
当函数执行时,循环count次;
5.2.5 多个函数
public class TestFunction2{
public static void main(String[] args){
System.out.println("床前明月光,");
System.out.println("-----------"); //普通方法打印
System.out.println("疑是地上霜。");
printSign(11,'#'); //调用函数打印
System.out.println("举头望明月,");
printSign(12,'*');
System.out.println("低头思故乡。");
printSign(13,'-');
}
//定义函数(打印符号),定义形式参数
public static void printSign(int count , char sign){
for(int i = 1;i <= count;i++){
System.out.print(sign);
}
System.out.println();
}
}
- 实际参数:10,’#’
调用带参函数时,依次传入实参,类型、个数、顺序,必须与形参对应; - 形参:int count , char sign
当函数被执行时,打印count次sign;
5.2.6 如何定义参数
- 经验:
根据具体的业务需求,来定义函数的参数;
import java.util.Scanner;
public class TestFunction3{
public static void main(String[] args){
//用户登录验证的模拟
//1.输入用户名和密码
//2.验证用户名(aaron)和密码(123456)
System.out.println("---程序开始---");
login(); //调用登录
System.out.println("---程序结束---");
}
//登录
public static void login(){ //单一职能原则(一个函数只做一件事)
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.next();
System.out.print("请输入密码:");
String password = input.next();
//调用检查
check(username , password);
}
//检查
public static void check(String username , String password){
//比较
if("aaron".equals(username) && "123456".equals(password)){//字符串的比较要用("".equals(""))比较
System.out.println("登录成功!");
}else{
System.out.println("登录失败,输入错误");
}
}
}
- "==“比较的是地址而不是内容,所以当比较字符串时,”=="不够准确;
- 比较字符串时,应用s1.equals(s2),可准确的比较字符串的内容
- 当比较两个字符串不一致时,应用 !s1.equals(s2),(逻辑运算符:非)代表”不等“;
5.3 返回值
5.3.1 概念
- 定义函数,计算两个整数的和,并返回结果,在main中打印;
- 定义语法:
public static 返回值类型 函数名称(形式参数列表){
//函数主体
retrun value;//返回值
}
- 返回值类型:
规定返回值的具体类型(基本、引用、void) - 返回值:
根据需求返回一个结果(值) - 调用语法:
变量 = 函数名称();
- 变量:
变量类型与返回值类型一致
public class TestResultValue{
public static void main(String[] args){
int result = add(5 , 6);
System.out.println(result);
int result2 = subtract(10 , 3);
System.out.println(result2);
}
//加
public static int add(int a , int b){
int result = a + b;
return result;
}
//减
public static int subtract(int a , int b){
return a - b;
}
}
- add(5,6); 接收返回值:
函数调用的表达式,最终即代表了所返回的结果 - int 返回值类型:
定义时,约定了返回的结果类型 - return a - b;返回值:
与返回值类型匹配的具体结果,在return关键字的后面追加具体值
5.3.2 return关键字
- 注意:
一个函数只能有一个返回值;
当有返回值的函数存在分支结构时,必须保证每条分支都具有正确的返回值 - return的两种用法:
应用在具有返回值类型的函数中:
return value; //表示结束当前函数,并伴有返回值,返回到调用函数处
应用在没有返回值类型(void)的函数中:
return; //表示结束当前函数,直接返回到函数调用处;
5.3.4 总结
- 注意:
一个类可以定义多个函数,函数之间属于并列关系,不可嵌套; - 经验:
一个函数只做一件事; - 好处:
减少代码冗余;
提高复用性;
提高可读性;
提高可维护性;
方便分工合作;
5.4 递归
5.4.1 递归
-
实际开发中,递归可以解决具有既定规律的特定问题; 何时使用递归?
当需要解决的问题可以拆分成若干个小问题,大小问题的解决方法相同;
有固定规律,函数中自己调用自己; -
如何正确使用递归?
设置有效的出口条件,避免无穷递归;
public class TestGetSum{
public static void main(String[] args){
//计算1~5之间的总和
int sum1 = 0;
for(int i = 5;i >= 1;i--){
sum1 += i;
}
System.out.println(sum1);
int result = getSum(5);
System.out.println(result);//使用循环可以做到的递归也可以
}
//计算1~5之间的总和
public static int getSum(int n){
if(n == 1){
return 1;
}
return n + getSum(n - 1);
}
}
5.4.2 递归阶乘
import java.util.Scanner;
public class TestFactorial{
public static void main(String[] args){
//求阶乘
Scanner input = new Scanner(System.in);
System.out.print("请输入一个1~12之间正整数:");
int num = input.nextInt();
System.out.println(num +"的阶乘是:"+ factorial(num));
}
//计算阶乘
public static int factorial(int n){
if(n == 1){
return 1;
}
return n * factorial(n - 1);
}
}
- 注意:
所有能以递归解决的问题,循环都能解决。当解决复杂问题时,递归的实现方法更为简单。
5.4.3 斐波那契数列
import java.util.Scanner;
public class TestFibonacci{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入一个正整数,显示对应的斐波那契数列项:");
int num = input.nextInt();
System.out.println("斐波那契数列的第"+ num +"项为:"+ fibonacci(num));
}
//斐波那契数列
public static int fibonacci(int n){
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
5.5 总结
-
函数的概念:
实现特点功能的一段代码,可反复使用; -
函数的定义:
public static void 函数名(){函数的主体};
-
函数的组成:
形参列表、实参列表、返回值类型、返回值、函数名、函数主体; -
函数的调用:
函数名(实参···);
-
函数的好处:
减少冗余、提高复用性、可读性、可维护性、方便分工合作; -
递归:
将大问题拆分为若干个小问题、大小问题的解决方法相同