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;
    }
}


相关文章
|
Java
java中递归实例
java中递归实例
121 0
|
12月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
87 1
java基础(11)函数重载以及函数递归求和
|
算法 Java
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
184 7
|
Java
蓝桥杯Java组暴力递归搜图
蓝桥杯Java组暴力递归搜图
85 4
java实现斐波那契数列(递归、迭代、流)
java实现斐波那契数列(递归、迭代、流)
215 1
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
276 1
|
Java
Java递归:深入理解与应用
Java递归:深入理解与应用
144 1
|
Java
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配...
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配
117 2
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
算法 Java
Java程序设计基础——递归
Java程序设计基础——递归

热门文章

最新文章