所有的高级编程语言里面都有函数的定义,非常重要。
Java里面函数:就是定义在类里面的一段独立的小代码,为了完成特定功能,也叫方法。
Main函数是一个特殊的函数,因为他是java程序的执行入口。
为什么要使用函数?
函数是为了代码的重复使用。
修饰符 返回值类型 函数名 (参数类型 参数名1,参数类型 参数名2 ……)
{
一小段代码
Return
}
修饰符:顾名思义,修饰的作用,为啥main函数不能直接调用本类定义的其他函数,因为其他函数必须是静态的才可以直接调用,后面讲到。
Public private protected
返回值类型:函数运行后结果的类型
返回值类型有一种特殊类型是void表示没有任何返回值
参数类型:形式参数的数据类型
形式参数:是一个变量,为了存储等到函数调用的时候传递的实际参数数据。
实参:函数调用时传递的数据。
Return:用于结束当前函数。
/**
* 求1加到n的和
*/
public static int add(int n){
int sum=0;
for(int i=0;i<n;i++){
sum+=(i+1);
}
return sum;
}
调用方式
函数名(实际参数…….)
返回值一般会赋值给一个变量,便于后面使用。
调用函数要清楚该函数属于哪个类?
如果该函数定义为static,可以通过:类名.函数名(实际参数);
如果不是static,先创建一个对象。Student s=new Student();
S.study();
重构代码,将可能被反复使用的代码独立起来,然后起个名,写成函数即可。
也就是为了代码复用。
函数嵌套是指一个函数定义里面,使用了另一个函数。
递归调用是指一个函数定义里面调用了自己。
递归两个重要条件:
递归可以不断的化简复杂问题,每一次操作都是相似规则的操作
递归要有出口,有最终结束的条件
递归的使用场合:
逻辑比较复杂,并且参数取值比较大,通过循环难以解决的问题。
用递归解决可以化简问题的复杂程度,因为每一次执行函数体的时候问题都不复杂。
并且每执行一次函数体,问题就被化简一次,直到到达设置的递归结束条件的时候,整个问题求解结束。
举例:
1.阶乘
public static long jiecheng(int n){
long result=1;
//求n的阶乘就是求n乘以n-1的阶乘
if(n>1)
{
result=n*jiecheng(n-1);
}
//递归结束条件
if(n==1) {
result=1;
}
return result;
}
2.经典汉诺塔问题
要求就是将n个盘子从a经过b移动到c
不管盘子移动到那根柱子都是大盘子在下小盘子在上
每次只能移动一个盘子
From-----------------middle---------------to
思路:
将上面的n-1个盘子从from柱子经过to移动到middle上
将第n个盘子直接移到to
将middle上面的n-1个盘子经过from柱子移动到to
package yantai;
public class Hanio {
/**
*
* @param n
* @param from
* @param middle
* @param to
* 思路:
1. 将上面的n-1个盘子从from柱子经过to移动到middle上
2. 将第n个盘子直接移到to
3. 将middle上面的n-1个盘子经过from柱子移动到to
*/
public void hanio(int n,String from,String middle,String to){
if(n==1){
System.out.println("将"+n+"号盘子从"+from+"移动到"+to);
}
else{
hanio(n-1, from,to,middle);
System.out.println("将"+n+"号盘子从"+from+"移动到"+to);
hanio(n-1,middle,from,to);
}
}
}
/**
* 如果一个数等于其所有因子之和,我们就称这个数为"完数",例如 6的因子为1,2,3 6=1+2+3
6就是一个完数.请编程打印出1000以内所有的完数
*/
}