【Java基础】方法和递归

方法的概念以及使用

方法的概念及好处

方法可以理解为一个代码片段. 类似于 C 语言中的 “函数”。方法存在的意义主要有以下几种:

  1. 当代码规模比较复杂的时候,我们可以通过方法进行模块化的组织代码。
  2. 在没有使用方法之前,在整个Java文件中可能会出现代码重复使用的情况。而我们使用方法以后,我们可以做到一份代码可以在多个位置使用,这样可以极大的节约编码时间,提升工作效率。
  3. 方法的使用能够让代码更好理解更简单。

方法的使用

是否需要进行“函数声明”?

不需要。我们知道,在C语言中存在“函数声明”这样的一个概念。在C语言中程序的执行过程是自上而下的,如果函数的执行代码块在主函数下方,则在C语言程序中是需要在主函数中对该函数进行声明的。
在Java中,程序是整体进行编译运行的,因此并不需要C语言中的函数声明要求。

编写方法的语法格式

// 方法格式如下
修饰符 返回值类型 方法名称([参数类型 形参 …]){
方法体代码;
[return 返回值];
}

在进行方法编写过程中,我们需要注意以下几点注意事项:

  1. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成
    void
  2. 方法名字:采用小驼峰命名
  3. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开,形参与实参之间一一对应,返回值类型必须匹配。
  4. 方法体:方法内部要执行的语句
  5. 在java当中,方法必须写在类当中
  6. 在java当中,方法不能嵌套定义

下面以判断是否闰年作为举例

public static boolean isLeapYear(int year){
	if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
	return true;
	}else{
	return false;
	}
}

在方法编写完以后,需要在main函数中调用方法。如下所示

public static void main(String[] args) {
        int x =1;
        int y =2;
        int sum = add(x,y);
        System.out.println(sum); //3
    }

在传入参数方面有一些需要注意的:当存在多个参数传入方法中时,返回值的类型应当注意返回值运算后的类型。

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

方法执行步骤可以概括为:调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行

*陷阱

在方法中,传入形参的只有参数的值。传参和实参一样,在拥有值以后会开辟出属于自己的地址。
下面以最基础的交换数字方法作为例子。

public static void swap(int x , int y){
        int tmp = x;
        x = y;
        y = tmp;
        System.out.println("形参中的x:"+ x);
        System.out.println("形参中的y:"+ y);
    }
    public static void main(String[] args) {
        int x = 1;
        int y = 2;
        swap(x,y);
        System.out.println("实参中的x:"+x);
        System.out.println("实参中的y:"+y);
    }

运行结果:
在这里插入图片描述

在运行了这段代码以后我们会发现,x 和 y的值是没有发生改变的。原因是在swap方法中x 和 y通过tmp交换了数值,但仅仅只是形参中的x和y的值发生改变,并不会影响main方法中的实参。

没有返回值的方法

当一个方法没有返回值,则return语句中不能包含其他元素,只是代表着方法的结束,return语句后面的代码将不会被执行,因此我们需要格外注意return语句的位置。

方法重载

方法命名是一门艺术,而在我们编写过程中,需要根据不同的需求进行不同方法的编写。那么这时候有一个问题随之产生:假如同样是add方法,其中的传参类型不同,那么我们应该如何命名呢?是add1(),add2()……
为了解决这类问题,Java为我们提供了方法的重载。即当方法的参数列表不同时,我们只需要设置多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
方法重载的特点:
1.方法名相同;
2.返回值类型不同不影响方法的重载;
3.方法的参数列表不同(参数类型,参数个数,参数顺序,)

以add方法举例
	public static double add(double a ,double b) {
        return a+b;
    }
    public static int add(int a ,int b) {
        return a+b;
    }
    public static long add(long a ,int b) {
        return a+b;
    }
    public static long add(int a ,long b) {
        return a+b;
    }

递归

引入:在高中学习阶乘时,以5!为例,我们知道是54=20,203=60……递归就像数学上的“归纳法”一样,以初始条件通过递推公式进行计算。
在计算机语言中,我们可以理解递归是在一个方法的执行过程中调用自身。当然,如果只是单纯的调用自身的方法体代码,我们知道程序将会出现“死循环”的结果。这显然是不对的。那么递归条件有哪些呢?

递归的解释

1.什么时候使用递归?当遇到原问题可以划分成子问题(子问题与原问题的解法相同),我们可以采用递归的方法实现“大事化小,小事化了”。这对于我们解决问题有着很大的帮助。
2.递归的过程中应当拥有停止条件,即递归出口。

以阶乘代码为例

先上代码:

public static int fac(int n){
        if (n == 1){
            return 1;
        }
        return n * fac(n-1);
}
public static void main(String[] args) {
        int ret = fac(4);
        System.out.println(ret);
    }
   

图解:
在这里插入图片描述
分析:在递归过程中,我们可以理解为递出和回归两个主阶段,当if语句中的条件无法达到时,就会执行之后的代码块,在每次”递“的过程中,n–,知道n=1的时候,就开始了“归”的过程,将return中得到的结果逐步返回知道到达最开始的①代码块,得到最终的答案。
递归是一个需要横向思考的方法,

汉诺塔进行递归

汉诺塔是十分经典的递归问题,不清楚汉诺塔的同学请移步百度。
解析:假定存在三根柱子A、B、C,柱子上的盘子存在若干个。
当只有一个盘子时(如图),从起始位置A移动到终点位置C只需要一步,即A->C。
当存在两个盘子,则需要三步;
存在三个盘子时,需要7步
……
因此我们通过数学归纳法可以知道,移动的步数可以归纳为x=2^(n) - 1。
在这里插入图片描述
用数学归纳法很容易得出的数字,我们应该如何使用代码进行解释呢?
我们在移动过程中可以发现,当n个物体需要移动时,我们首先需要将n-1个物体移动到B上,再将A上的物体移动到C上,如此往复。
通过规律观察,我们可以发现,在n个物体情况下,需要以中间体作为跳板进行移动。而跳板是在A和B之间不断变化的。
在这里插入图片描述

代码编写过程:

首先我们编写Move(char pos1,char pos2)方法,在该方法中打印出圆盘的移动起始点和终点。
接下来编写hanio(int n,char pos1,char pos2,char pos3)方法,将圆盘数量n以及三个圆柱传入。
当存在特殊情况,即n=1时,我们可以直接将物体从A移动到C。
当n != 1时,我们首先将n-1个圆盘通过C移动到B,移动完成后,圆柱A上仅存一个,满足n=1的情况,因此可以直接使用move(pos1,pos3).
在移动完成后,圆柱A上不存在物体,而B上存在n-1个圆盘,因此我们使用老方法,通过B将n-1个圆盘移动到C。
如此循环反复。
得到的代码如下:

public static void move(char pos1,char pos2){
        System.out.print(pos1 + "-> "+pos2 + " ");
    }

    public static void hanoi(int n,char pos1,char pos2,char pos3){
        if (n == 1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }

拓展

程序运行规则

在Java程序运行的过程中,每个方法会在栈中开辟栈帧。
一旦程序遇到return或程序运行结束后,就会把当前方法的栈帧从栈上销毁,这样一来极大的提高了栈的利用率。
方法的出现提高了代码的可读性和利用率,是Java中十分重要的概念及应用。

结尾

如果需要获取相关代码,可以前往我的gitee账户中获取。
JavaSE方法以及递归代码(戳这里)
感谢浏览!

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值