0
点赞
收藏
分享

微信扫一扫

Java方法的使用和递归

星河出山 2022-04-13 阅读 50
java

目录

1.方法的使用

1.1什么是方法

1.2方法的定义语法

1.3方法的调用

1.4没有返回值的方法

1.5方法的重载

2.递归

2.1什么场景下能用方法递归?(数据结构和算法)

2.2 什么场景下可以用方法递归?

2.3 咋样写出递归代码?

2.4使用递归的练习

2.4.1  使用递归求N的阶乘

2.4.2  使用递归解决青蛙跳台阶问题 

2.4.3 计算1+2+3+...+n的和。 

2.4.4 用归找出数组的索引

3.每日一汤 

 


1.方法的使用

1.1什么是方法

方法就是一个代码片段,类似c语言中的“函数”。就是把一段{}中代码抽出来的片段。

方法存在的意义:

1.是能够模块化的组织代码(当代码规模比较复杂的时候)

2.做到代码被重复使用,一份代码可以在多个位置重复使用

3.让代码更好理解更简单

4.直接调用现有的方法,不必重复造轮子

1.2方法的定义语法

public static 方法返回值 方法名称(0...N){

//方法体代码

【return 语句】;

}

1.3方法的调用

返回值变量 = 方法名称(参数);

import java.util.Scanner;

public class Best {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入第一个数:");
        int a = sc.nextInt();
        System.out.println("输入第二个数:");
        int b = sc.nextInt();
        System.out.println("输入第三个数:");
        int c = sc.nextInt();
        System.out.println(a+","+b+"和"+ c+"中最大的是"+ max2(a,b,c));
//  max2把a,b,c先赋值给x,y,z
    }
    public static int max2(int x,int y ,int z ){
        int sum = max(x,y);
//  调用max方法,将x,y赋值给下面的x,y
        return max(sum,z);
//  经过下面max的方法判断出x,y的大小,最大值num在赋值给sum,
//  再次调用max方法,将sum和z的值赋给下面的x,y,将最大值赋给max2
    }
    public static int max( int x,int y){
        if (x > y){
            int num = x;
            return x;
        }else{
            int num = y;
            return num;
        }
    }
}

基本规则:

1.定义方法的时候,不会执行方法的代码,只有调用的时候才会执行。

 2.当方法被调用的时候,会将实参赋值给形参。

3.参数传递完毕后,就会执行到方法体代码。

4.当方法执行完毕后(遇到return语句),就执行完毕,回到方法调用位置继续往下执行。

5.一个方法可以被多次调用。

**实参和形参的关系:在Java中,方法的参数传递只有值传递,所谓的值传递就是把实参的值赋值给形参,对实参没有任何影响。方法的返回值可有可无,没有返回值的方法使用void声明,仍然可以使用return;表示提前结束方法的调用。(直接终止本次方法的调用,返回调用处继续执行)

1.4没有返回值的方法

public class Copy {
    public static void main(String[] args) {
        int num = 1234;
        sum(num);
}
    public static void sum (int num){
// 没有返回值,只需要打印,只是输出。
        if (num > 9){
            sum(num / 10);
//找到最高位
        }
        System.out.print(num % 10+"\t");
// 按顺序打印每一位
    }
}

没有返回值的方法用void。

1.5方法的重载

方法重载(overload)):方法重载发生在同一个类中,定义了若干个方法名称相同,参数列表不同(参数的类型或个数)的一组方法,与方法的返回值无关!Java中System.out.println(任何参数类型都可以),实际上是因为System定义了N个重载方法。

在上面的那个代码中,在同一个class类中,定义了max和max2,参个数不同,发生了方法重载。

2.递归

2.1什么场景下能用方法递归?(数据结构和算法)

2.2 什么场景下可以用方法递归?

a.一个大问题可以拆分成若干个子问题的解。
b.拆分后的子问题和原问题除了数据规模不同,解决思路完全相同。
c.必须存在递归的终止条件。

2.3 咋样写出递归代码?

在写递归函数时,千万不要纠结函数内部咋实现,而要注意这个方法的语义(这个方法到底有什么方法),你就假设这个方法别人已经写好了,只需要自己拿来调用而已。
写出递归代码分为以下几步:终止条件+不借助任何方法就能实现的步骤+剩下的问题利用这个方法去解决。
递归函数的关键:方法调用时程序会卡在方法的调用处,直到方法继续运行。

2.4使用递归的练习

2.4.1  使用递归求N的阶乘

import java.util.Scanner;

public class Diguijiecheng {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数N:");
        int num = sc.nextInt();
        System.out.println("N的阶乘为:"+ sum(num));
    }
    public static int sum ( int num){
        if (num == 1){
            return 1;
        }
        return num * sum (num - 1);
    }
}

2.4.2  使用递归解决青蛙跳台阶问题 

青蛙一次可以跳一节台阶,也可以跳2节台阶,求青蛙跳n节台阶一共有多少种方法。

import java.util.Scanner;

public class Frog {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入台阶个数:");
        int num = sc.nextInt();
        System.out.println("有"+jump(num)+"种方法");
    }
    public static int jump(int num) {
        if (num == 1 || num == 2) {
                return num;
            }
            return num = jump(num - 1) + jump(num - 2);
        }
    }

可以类比为斐波那契数。

2.4.3 计算1+2+3+...+n的和。 

import java.util.Scanner;

public class He {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数:");
        int num = sc.nextInt();
        System.out.println("1到这个数之间所有的整数和:"+sum(num));
    }
    public static int sum(int num){
        if (num  == 1){
            return 1;
        }
        return num + sum (num -1);
    }
}

2.4.4 用归找出数组的索引

public class DiGui {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        System.out.println(sum(arr,9,0, arr.length - 1));
    }
    public static int sum (int[] num ,int toFind ,int left,int right){
        if(left > right){
            return -1;
        }
        int mid =(left + right ) / 2;
        if (num[mid] == toFind){
            return mid;
        }else if(toFind < num[mid]){
            return sum(num,toFind,left,mid - 1);
        }
           return sum(num, toFind, mid + 1 , right);
    }
}

3.每日一汤 

      谁会记得昨天吃了什么?记得三天前吃了什么?你的菜单是什么?你记不住了,但是这些东西成为了你的养分。读书也是这样,我们并不需要记住那些精彩的段落,我们只需要去读,慢慢的就成为了我们的养分。也许今日所学,你并不完全记忆,但是每日去积累,总有那么一天,你会剥开那层云雾,看见蓝天。加油,求学小子! 

 

 

 

举报

相关推荐

0 条评论