0
点赞
收藏
分享

微信扫一扫

【JAVA】方法递归

杏花疏影1 2022-05-03 阅读 50

本章目录

1.方法的定义&使用

定义:方法就是C语言中的函数,为了使程序的某项功能可以方便重复使用,而书写一个方法(函数),调用方法(函数)来达到想要执行的目的

我们只需在花括号里输入咱们的方法体即可

比如说我们现在写一个求两个整数和的方法

public static int add(int a, int b){

        return a + b;
    }

   public static void main(String[] args) {
       System.out.println(sum(1, 2));
   }

 

方法中的 return a+b 是方法体,在主函数main中直接调用即可

值得一提的是在调用sum方法时传参1和2,由图可知参数前多了字母a与b和冒号,这是编译器自己输入上去的,并不是程序员输入的。

注意:

1.参数的个数必须匹配

2.参数的类型必须匹配

3.参数的顺序必须匹配

接下来说说方法的返回值,有的方法在定义的时候需要传回参数,所以得设置返回值,有的不需要,则不需要设置返回值,根据具体实现的方法来判断是否return方法的结果,return了结果就能使用结果。

在java中,方法有以下注意事项

1.public static 是修饰符,固定搭配

2.方法名用小驼峰命名,numMax

3,. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开

4.方法必须写在类中

5.不能嵌套定义

6,java方法不像C语言的函数,没有函数声明一说,想写在哪个位置都行,main都可以直接调用


2.方法传参

下面讲讲函数中形参与实参的关系

在main中,我们往方法中传入参数,此时main中的参数叫做实参,当我们传入实参给方法后,方法的形参变量会接收到实参,然后对实参进行一份临时拷贝,形参拷贝了实参的值后在方法中进行“加工”,完事后如果有返回值则传回返回值给main,传回后方法中的变量被销毁。

注意:在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

因为是临时拷贝,所以方法中的形参无法对实参进行操作


3.方法重载

在介绍方法重载在之前,咱们先思考一个问题:

我们定义一个add方法来计算两个整数的值,那当我们想要计算3个整数的值呢?那得重新定义一个返回a+b+c的值的add2,当我们要定义两个double类型的和呢?又要重新创建一个新的方法名为doubleAdd的方法?如果非要这样,那当我们要调用一些功能类似,但是方法名不一样的方法,这会很麻烦,一会要调用add,一会i又要调用add2,一会还得调用doubleAdd,这就得需要我们记住很多方法的方法名,尽管它们的功能大同小异,都是数字的相加。

为此,如果我们需要避免这种麻烦事发生,我们可以把它们的功能分别用同一个方法名来定义,就相当于我们只要调用同一个方法名,就能使用不同的功能

下面请看代码

public static double add(double a, double b){
        return a+b;

    }
    public static int add(int a,int b,int c){
        return a+b+c;
    }

    public static int add(int a, int b){

        return a + b;
    }

如代码所示,我们定义3个方法名都为add的方法,编译器却没有报错,我们观察这3个方法,虽然方法名相同,但是参数类型和方法体却不相同,这就叫方法的重载-->就相当与add函数有了3中功能:可计算两个整数和,可计算3个整数和,可计算两个浮点数的和

请看代码的运行结果,用add实现了3中运算,避免了背方法名和查看不同方法名的繁琐

 在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

方法重载需要以下注意

1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关

错误提醒

 


4.递归

递归就是方法自己调用自己,将条件传递出去(传给自己),又将结果归还回来

递归的条件:

1.在方法内部,自己调用自己

2.在调用自己的过程中要有一个趋近于终止的条件

如果我们不给递归一个终止条件,任其不停的递归下去,程序会出栈溢出的问题

 public static void func(){
        func();

    }
    //异常
    public static void main(String[] args) {
        func();
    }

当我们使用递归的时候,为了避免上述问题,一定要确保自己的终止条件的正确性

下面我们来举一个用递归书写的例子

求N的阶乘:输入5  输出1*2*3*4*5

 public static int fac(int n){
        if(n == 1){
            return 1;
        }
        int tmp = n * fac(n-1);
        return tmp;
    }

public static void main3(String[] args) {
       // fac(4);
        System.out.println(fac(4));
}

 如图分析递归的过程,红线代表传递的过程,绿线代表遇到终止条件归还的过程

n == 1 是方法的终止条件,n* fac(n - 1) 是方法的递推公式

以上分析可以看出:每次执行到当前方法的一部分时,就去执行另外一部分了

 我们要使用递归,就两点方法:

1.找到递推公式

2.找到终止条件

接下来是几个递归练习代码

1.输入1234,输出1+2+3+4

 public static int sumEvery(int n){
        if(n < 10){
            return n;
        }
        int tmp = n%10 + sumEvery(n/10);
        return tmp;
    }

2.输入5,输出1+2+3+4+5

    public static int sum(int n) {
         if (n == 1) {
            return 1;
        } else {
            int ret = n + sum(n - 1);
             return ret;
        }
    }

3.输入整数1234,顺序打印1 2 3 4 

    public static void print(int n){
        if(n < 10){
            System.out.println(n);
        }else{
            print(n/10);
            System.out.println(n%10);
        }
    }

接下来再举例一个特殊例子:斐波那契数列

    public static int fib(int n){
        if(n == 1 || n == 2){
            return 1;
        }
        int tmp = fib(n-1)+fib(n-2);
        return tmp;
    }

这是斐波那契数列的递归书写,但是用递归来实现斐波那契数列会做许多重复运算,降低程序效率,当想求的数字越大,程序运行越慢,效率低下

对于斐波那契数列我们选择迭代(循环)的方法来实现,提高程序效率

    public static int fib2(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        int f1 = 1;
        int f2 = 1;
        int f3 = 0;
        for (int i = 3; i <= n ; i++) {
            f3 = f1+f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }

本章完~~

举报

相关推荐

0 条评论