zoukankan      html  css  js  c++  java
  • Java基础10-方法的重载与递归

    一、方法的重载

    1.为什么要重载?

    首先我们先来看不同数据类型求和的需求

        public static void main(String[] args) {
            //我们每次调用不同的求和方法时需要调用不同的方法名
            getsum1(10,20);
            getsum2(1.0,2.0);
            //当如果我们业务量很大,但是调用的方法又是同类型的,所实现的功能基本相同时,我们每次都要输入不同的方法名,那么多方法名还要一个一个记住,是不是很麻烦?
        }
        //声明一个整数求和的方法,返回值为int类型,两个形式参数a和b
        public static int getsum1(int a,int b) {
            return a+b;
        }
        //声明一个小数求和的方法,返回值为int类型,两个形式参数a和b
        static double getsum2(double a,double b) {
            return a+b;
        }

    所以,为了屏蔽了统一功能的方法由于参数不同所造成的方法名称不同,简化代码提高代码健壮性,就需要方法的重载。

    2.什么是方法的重载?

    重载方法定义:在同一个类中,某方法允许存在一个以上的同名方法,只要他们的参数列表不同即可。

    我们用一个例子就可以搞懂,只需要把上边的代码修改一下

        public static void main(String[] args) {
            getsum(10,20);
            getsum(1.0,2.0);
        }
        //声明一个整数求和的方法,返回值为int类型,两个形式参数a和b
        public static int getsum(int a,int b) {
            return a+b;
        }
        //声明一个小数求和的方法,返回值为int类型,两个形式参数a和b
        static double getsum(double a,double b) {
            return a+b;
        }

    是不是两个方法名是相同的,但传入的值数据类型是不同的?
    没错,这就是重载,只要我们传入的实参值要么类型不同,要么个数不同,要么顺序不同,程序会自动找到我们是想要调用那个同名的方法

    3.方法重载的原则

    两同一不同原则

    两同:在同一个类中,方法名相同

    一不同:方法的参数列表不同(参数类型、参数个数、参数顺序)。

    非常典型的一个例子就是我们的print()方法

        public static void main(String[] args) {
    //可以打印不同数据类型的值
            System.out.println("重载");
            System.out.println(123);
            System.out.println(3.2);
            System.out.println(true);
        }

    注意:

    println是可以打印空行的,我们来看源码就非常清晰,直接调用了一个newLine()的方法。

        public void println() {
            newLine();
        }

    而当我们传入参数时,其实也是调用这个方法,先调用了print()方法输出之后调用换行的方法来实现的

        public void println(boolean x) {
            synchronized (this) {
                print(x);
                newLine();
            }
        }

    看完print方法是不是更好地理解了为什么要重载? 如果没有重载,那我们每次要打印输出的时候就要写不同的print方法名了,再加上println的方法名,可想而知需要记住很多东西,可是很容易记混和掉头发的哦。

    二、方法递归

    1.什么是方法的递归

    方法的递归简单地说就是方法自己调用自己,其实也类似于一种循环。

    举个例子,我们上学时都学过斐波那切数列:

    F(0)=0,F(1)=1, 当n>1时,F(n)=F(n-1)+F(n-2)  

    例如我们求F(5)=F(4)+f(3),而F(4)=F(3)+F(2),F(3)=F(2)+F(1),F(2)=F(1)+F(0)

    这样其实F(5)=5F(1)+2F(0)

    我们并不好得出一个规律来计算这个数列,所以就需要用到递归来解决这种问题

        public static void main(String[] args) {
            int ret=fn(6);
            System.out.println(ret);
        }
        public static int fn(int n) {
    //当n==0是,返回值为0
            if(n==0) {
                return 0;
            }else if(n==1) {
    //当n==1时返回值为1
                return 1;
            }else {
    //当n>1时,调用自身fn,将n-1,和n-2这个参数传入到fn()方法中。如果n-2和n-1还是大于1和0,那么就继续调用自身fn(),直到值==0或1,之后依次返回0和1进行运算
                return fn(n-1)+fn(n-2);
            }
        }

    我们在我的电脑里进入每个盘,在进入到每个盘的文件夹,依次往下,这个操作其实就是递归方法。

    注意:  在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。不然很容易陷入到死循环导致崩溃。

     2.递归有什么用途呢?

    知乎大神列举了一些用途个人感觉还是很不错的。当然我们刚开始接触java可能用的并不是很多,随着我们以后的发展,可能会接触到递归算法。

    1 所有的(裸)深度优先搜索算法 具体使用的例子有,几乎所有npc问题,人工智能推导。。。
    2 树的相关算法 具体使用的例子有,代码的编译(语法树),字典(map)的搜索树实现(各种bst),搜索引擎字符串检索算法(利用trie)。。。
    3 图的相关算法 例子,运输规划(最大流),游戏中的怪物ai(A*搜索) 。。。
    4 分治法 例子,快速排序,归并排序。。。
    5 动态规划(记忆化搜索) 例子太多不举了。。
    6 并发算法 利用递归的许多算法都是良好的并发算法
    链接:https://www.zhihu.com/question/28778134/answer/84681099
    来源:知乎
  • 相关阅读:
    从汇编看c语言函数调用
    安家之由
    算法设计新思路
    AcceptsReturn
    silverlight 导出DataGrid 数据到Excel
    siliverlight双击事件
    如何:以编程方式调用按钮的 Click 事件 (Visual C#)
    左连接出错
    C# 根据当前时间获取,本周,本月,本季度等时间段
    验证用户登陆
  • 原文地址:https://www.cnblogs.com/LuckyGJX/p/8885165.html
Copyright © 2011-2022 走看看