函数是什么?
大家一看到函数二字可能就会联想到数学中的函数,但其实这就是两个完全不同的东西。
- 那么究竟Java中的函数是什么呢?
- Java中的函数又叫做方法,它是用来解决某一特定的问题代码集合。
- 它有简化整个过程的作用,而且提高了代码的复用性。比方说,我们将解决一个问题的一块代码写进一个函数内,这样我们需要再次解决同样的问题时就可以直接调用,也就不需要在重新写这块代码。
Java中如何定义函数
既然我们清楚了函数是什么,也了解了他们的作用是什么,那么我们就一起看看Java中如何定义函数吧。
访问修饰符—— 函数返回值的类型或void —— 函数名称([参数列表]) {
————函数体;
————return 返回值;//如果是void就不需要返回值
}
- 返回值的类型是什么必须在函数名前写清楚,如果不能发生自动转换的则会出现错误提示。
- 函数的名称也是标识符的一种,需要和标识符的命名规则一致。
- [参数列表]——这里用来接收值,不是所有的函数都需要接收值。
函数的调用
函数的调用——也就是利用代码使用函数的功能解决问题。
因为函数是不会自己执行的,它需要通过调用才能执行。
一般形式:
函数名称([参数列表]);
有时候我们需要接收函数的返回值,比如返回值为int类型:
int a = 函数名称([参数列表]);
或者先声明a,再用来接收返回值也是可以的。
函数的分类
众所周知,任何事物都具有多面性,也就是说我们可以根据不同的标准分不同的类。
函数的分类也是如此。
- 根据有无参数分类可分为
|---- 有参函数
|-----无参函数 - 根据有没有返回值可分为
|----有返回值函数
|----无返回值函数 - 根据定义者可分为
|----系统函数
|----第三方定义的函数
|----自定义函数——也就是我们自己写的实现功能的函数,也是构造函数。
函数的重载
函数重载——就是函数的名称相同而参数的类型、数量不同,调用的之后,自动根据参数的类型和数量匹配相对应的函数。
注意,函数的调用只和函数名称和参数有关,和函数的返回值没有关系。
lass TestOverLoad {
public static void main(String[] args) {
byte a=12;
add(10,20);//调用第一个add函数
add(10,20.5);//调用第二个add函数
add(10.5,20);//调用第三个add函数
add(10,a);//调用第四个add函数
add(10);//调用第五个add函数
}
public static int add(int a, int b) {
return a + b;
}
public static double add(int a, double b) {
return a + b;
}
public static double add(double a, int b) {
return a + b;
}
public static int add(int a, byte b) {
return a + b;
}
public static int add(int a) {
return a + 10;
}
}
函数的递归
什么是递归呢——函数自己调用自己就叫做递归。
- 优点:分治理念的体现,可以把非常复杂的问题简单解决。
- 缺点:缺点就是非常的耗费内存,当栈空间被占用时,会触发StackOverflowError异常!!!
下面我们就来看看递归的应用吧。
比如说,求斐波那契数列的第N项的值。
这是常规的方法,可以看到有些复杂。
import java.util.Scanner;
public class Test01{
public static void main(String[] args){
System.out.println("求斐波那契数列第N项的值(1,1,2,3,5…………)");
Scanner sc = new Scanner(System.in);
System.out.print("请输入N的值:");
int n = sc.nextInt();
System.out.println(feibo(n));
}
public static int feibo(int n){
int a = 1,b=1;
int temp;
for (int i = 2;i<=n ;i++ )
{
temp=b;
b = a+b;
a =temp;
}
return a;
}
}
这是用递归的方法。
斐波那契数列,我们知道他的第n项值等于(n-1)项加上(n-2)项的和所以我们只需要直接返回feibo(n-1) + feibo(n-2)就行,因为斐波那契数列前两项都是1,所以我们加一个条件判断,当n 等于1或者n等于2时令返回值为1就行。
注意:使用递归会非常的耗费内存,所以一般使用的递归的层数不要太大(不要大于1000层)。
而且一定要加上条件,不然就会变成死循环,会触发StackOverflowError异常!!!
import java.util.Scanner;
public class Test01{
public static void main(String[] args){
System.out.println("求斐波那契数列第N项的值(1,1,2,3,5…………)");
Scanner sc = new Scanner(System.in);
System.out.print("请输入N的值:");
int n = sc.nextInt();
System.out.println(feibo(n));
}
public static int feibo(int n){
if (n==1 ||n==2){
return 1;
}
return feibo(n-1) + feibo(n-2);
}
}