首先我们来看一下递归的定义方便加深理解:
记录递归是一种算法,指在程序设计语言中,方法直接
(如 methodA() 方法内部调用 methodA() )或间接(如 methodA() 调用 methodB(),methodB() 又调用 methodA() )调用自身的形式。
其实递归本质是在方法中调用自己
本文将会用几个典型的案例来解释递归的用法和思路,还有避免递归的危险区,如,死龟问题
(本章部分图片内容选自网络素材,如果有更好的解题思路或者解法欢迎评论区留言,共同进步💗💗💗)
目录
1、递归
1.1、递归入门案例
先易后难,先浅后深
思考问题:如何打印 2 - 5的值 (2,3,4,5)
//实现打印数字 2,3,4,5
public void f(int num1) {
if(num1 > 2){
f(num1 - 1);
}
System.out.print(num1 + " ");
1、n = 5 时 返回 f(1) f(2) f(3) f(4) 5
2、n = 4 时 返回 f(1) f(2) f(3) 4
3、n = 3 时 返回 f(1) f(2) 3
4、n = 2 时 返回 f(1) 2
5、n = 1 时 开始返回 1
逐层向上返回
输出结果为:
1.2、递归(*)
1.2.1、递归基本介绍
简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题 , 同时可以让代码变得简洁
自己调用自己
1.2.2、递归案例
1.2.2.1、打印问题
打印上面简单案例,并思考如果加上
else
结果会怎样
打印2-5
//Recursion01
public class Recursion01{
public static void main(String[] args){
T t1 = new T();
t1.test(5);//2,3,4,5
}
}
class T {
//分析
public void test(int n) {
if (n > 2) {
test( n - 1);
}
System.out.println("n = " + n);
}
}
思考 : 如果加上else结果是什么?
此时if和
else
作为一个整体,只会执行符合条件的num1 <= 2
的情况,即只会输出结果为:2
在哪里调用的就返回给谁
1.2.2.2、阶乘问题
//Recursion01
public class Recursion01{
public static void main(String[] args){
T t1 = new T();
t1.test(5);//2,3,4,5
int res = t1.factorial(5);
System.out.println(res);//120
}
}
class T {
//分析
//当n = 1 时返回 1
//当n = 2 时返回f(1) * 2
//当n = 3 时返回f(2) * 3
//当n = 4 时返回f(3) * 4
//当n = 5 时返回f(4) * 5
public int factorial( int n){
if(n == 1){
return 1;
}else{
return factorial(n - 1) * n;
}
}
}
一层层嵌套
过程分析
1.3、Recursion内存图
if ....else ....
内存图
1.4、递归的重要规则
如果是引用数据类型:就会共享数据,传递的是地址
1.5、递归课堂练习
1.5.1、斐波那契
当前数 = 前1数 + 前2数 ----》f(3) = f(2) + f(1);【并且f(2)和f(1)都为1】
如: 1 , 1 , 2 , 3 , 5 , 8 , 13 …