Java递归

简介: Java递归

ઇଓ 欢迎来阅读子豪的博客(Java语法篇)


☾ ⋆有什么宝贵的意见或建议可以在留言区留言


ღღ欢迎 素质三连 点赞 关注 收藏


❣ฅ码云仓库:补集王子 (YZH_skr) - Gitee.com


生活中的递归


从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是: "从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是: "从前有座山,山上有座庙..." "从前有座山……"


aad7825a1df646af90af9f8b921a5b79.png


递归要满足以下条件


       1、方法内部,在执行过程中自己调用自己,每次执行到一部分的时候去执行另外一个


       2、递归出口,要有趋近于终止的条件(归的起始条件)


方法是在栈上开辟,栈是有大小的,递归函数也要压栈,执行完了出栈,超出了栈大小会报栈溢出错,所以递归必须要设置尽头


490711f1e4c44a09a8947c766957a2b9.png


递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式


递归 = 递+归


递归 = 递(算函数值)+归(返回准确值)


代码示例: 递归求 N 的阶乘


public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
if (n == 1) {
return 1;
}
return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
ret = 120


代码示例 求斐波那契数列的第 N 项


public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}


当我们求 fib(40) 的时候发现, 程序执行速度极慢. 原因是进行了大量的重复运算


class Test {
    public static int count = 0;
    public static void main(String[] args) {
        System.out.println(fib(40));
        System.out.println(count);
    }
    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        if (n == 3) {
            count++;
        }
        return fib(n - 1) + fib(n - 2);
    }
}
// 执行结果
102334155
39088169 // fib(3) 重复执行了 3 千万次


可以使用循环的方式来求斐波那契数列问题, 避免出现冗余运算.


class Test {
    public static int count = 0;
    public static void main(String[] args) {
        System.out.println(fib(40));
        System.out.println(count);
    }
    public static int fib(int n) {
        int last2 = 1;
        int last1 = 1;
        int cur = 0;
        for (int i = 3; i <= n; i++) {
            cur = last1 + last2;
            last2 = last1;
            last1 = cur;
        }
        return cur;
    }
}


相关文章
|
2月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
31 1
java基础(11)函数重载以及函数递归求和
|
6月前
|
Java
java中递归实例
java中递归实例
44 0
|
4月前
|
算法 Java
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
81 7
|
5月前
|
Java
蓝桥杯Java组暴力递归搜图
蓝桥杯Java组暴力递归搜图
32 4
|
5月前
|
Java
java实现斐波那契数列(递归、迭代、流)
java实现斐波那契数列(递归、迭代、流)
|
5月前
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
60 1
|
5月前
|
Java
Java递归:深入理解与应用
Java递归:深入理解与应用
68 1
|
5月前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
38 0
|
5月前
|
Java 大数据 程序员
老程序员分享:java递归
老程序员分享:java递归
26 0
|
6月前
|
Java
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配...
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配
59 2