第5章 方法和递归

作者: yangsg | 来源:发表于2019-03-28 11:26 被阅读347次

    1. 方法作用

    简单地理解:方法就是将一段经常使用的代码,总结成一个函数。当需要使用这段代码时,通过调用总结的函数来解决即可。大大地简化重复代码的问题。
    实际理解方法,需要在面向对象章节中去完成

    2. 方法声明

    基本格式:

    访问权限(比如public) 返回值类型 方法的名字(参数列表)
    比如:public void display(int a, int b)

    public static void main(String[] args)是主方法,写法是固定的。表示的是整个软件的入口。
    main方法使用static(静态),main方法中直接使用某个其他方法,这个方法应该也是static(静态)的,比如:

    public static void display(int a, int b)
    
    2.1 有参数,有返回值

    对于某个方法,需要在外部提供数据来进行功能执行功能,将计算结果返回。
    示例1:定义一个计算整数m的n次幂的方法

    public static int pow(int m, int n) {
        int r = 1;
        for(int i = 0; i < n; i++) {
            r *= m;
        }
        return r;
    }
    

    这个方法是有返回值的,返回值定义的类型是int型,必须在方法的结尾处提供一个数据进行返回,比如“return r;”。如果不提供return语句,程序报错。

    2.2 有参数,无返回值

    对于某个方法,需要外部提供数据执行功能,但不需要提供任何结果。
    示例2: 定义一个显示数组中所有元素的方法

    public static void display(int[] a) {
        for(int i = 0; i < a.length; i++) {
            System.out.print(a[i]);
            System.out.print("\t");
        }
        System.out.println();
    }
    

    输入一个数组参数,进行控制台打印,不需要返回任何结果

    2.3 无参数,有返回值

    不需要外部提供任何数据,向外部返回某个数据
    示例3:定义一个提供随机整数[1,10]的方法

    public static int getRandomNumber() {
        Random r = new Random();
        int x = r.nextInt(10) + 1; //[1,10]
        return x;
    }
    
    2.4 无参数,无返回值

    不需要外部提供任何数据,无需向外部返回某个数据
    示例4:在控制台上打印随机浮点数[0,1)的方法

    public static void showRandomFloat() {
        double d = Math.random(); //生成[0,1)随机浮点数
        System.out.println(d);
    }
    

    3. 方法调用

    3.1 有参数,有返回值

    示例5:调用示例1的方法

    public static int pow(int m, int n) {
        int r = 1;
        for(int i = 0; i < n; i++) {
            r *= m;
        }
        return r;
    }
    
    public static void main(String[] args) {
        int x = pow(2,3);
        System.out.println(x);
    
    }
    
    方法参数和返回值调用理解
    3.2 有参数,无返回值

    示例6:调用示例2的方法

    public static void display(int[] a) {
        for(int i = 0; i < a.length; i++) {
            System.out.print(a[i]);
            System.out.print("\t");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] a = {1,2,3,4,7,8,5,3,2};
        display(a);
    }
    

    因为display方法返回值是void,在调用它时,不能利用任何的变量去接收返回值。

    3.3 无参数,有返回值

    示例7:调用示例3的方法

    public static int getRandomNumber() {
        Random r = new Random();
        int x = r.nextInt(10) + 1; //[1,10]
        return x;
    }
    
    public static void main(String[] args) {
        int a = getRandomNumber();
        System.out.println(a);
    
    }
    
    3.4 无参数,无返回值

    示例8:调用示例4的方法

    public static void showRandomFloat() {
        double d = Math.random(); //生成[0,1)随机浮点数
        System.out.println(d);
    }
    public static void main(String[] args) {
        showRandomFloat();
    }
    

    4. 方法递归(理解概念)

    递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
    递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
    如果递归没有边界条件,类似于循环没有结束条件,递归会进入到无限执行的情况,最终会占掉系统中所有内存,程序崩溃。

    4.1方法调用的栈结构

    栈是一种线性数据结构,它的特点只有一端可以存取数据。类似“弹夹”的结构。先进后出后进先出
    方法在调用时,进入方法栈,执行完毕后,从栈中弹出
    如图

    方法栈的进出
    4.2 递归调用的理解

    如图所示 :边界条件、递归前进段和递归返回段

    递归的理解

    示例1:求n的阶乘(5! = 5*4*3*2*1)

    public static int f(int n) {
        if(n == 1) {
            return 1;
        }else {
            return n*f(n-1);
        }
        
    }
    
    public static void main(String[] args) {
        int x = f(5);
        System.out.println(x);
    }
    

    思路:

    5! = 5*4!
    4! = 4*3!
    3! = 3*2!
    2! = 2*1!
    1! = 1

    换成表达式方式

    f(5) = 5*f(4)
    f(4) = 4*f(3)
    f(3) = 3*f(2)
    f(2) = 2*f(1)
    f(1) = 1

    求5的阶乘的方法栈变化,蓝色数字入栈次序,红色数字出栈次序

    笔试题:有一排人,第1个人是24岁,每个人都比他前面的人年龄多2岁,求第5个人的年龄(使用递归)。

    相关文章

      网友评论

        本文标题:第5章 方法和递归

        本文链接:https://www.haomeiwen.com/subject/khpfbqtx.html