学习Java第六天--函数之概念、参数、返回值、递归

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("登录失败,输入错误");
		}
	} 
}
  1. "==“比较的是地址而不是内容,所以当比较字符串时,”=="不够准确;
  2. 比较字符串时,应用s1.equals(s2),可准确的比较字符串的内容
  3. 当比较两个字符串不一致时,应用 !s1.equals(s2),(逻辑运算符:非)代表”不等“;

5.3 返回值

5.3.1 概念5474

  • 定义函数,计算两个整数的和,并返回结果,在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 递归

  1. 实际开发中,递归可以解决具有既定规律的特定问题; 何时使用递归?
    当需要解决的问题可以拆分成若干个小问题,大小问题的解决方法相同;
    有固定规律,函数中自己调用自己;

  2. 如何正确使用递归?
    设置有效的出口条件,避免无穷递归;

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 函数名(){函数的主体}
  • 函数的组成:
    形参列表、实参列表、返回值类型、返回值、函数名、函数主体;

  • 函数的调用:

函数名(实参···);
  • 函数的好处:
    减少冗余、提高复用性、可读性、可维护性、方便分工合作;

  • 递归:
    将大问题拆分为若干个小问题、大小问题的解决方法相同

发布了34 篇原创文章 · 获赞 7 · 访问量 1312

猜你喜欢

转载自blog.csdn.net/weixin_44257082/article/details/104251982