当前位置: 首页 > news >正文

递归(斐波那契数列、类加、累乘、打印多级目录)

概述:

递归:指在当前方法内调用自己的这种现象。

递归的分类:递归分为两种,直接递归和间接递归。

直接递归称为方法自身调用自己。

间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

注意事项:

1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。

2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

3.构造方法,禁止递归。

递归的使用前提:

当调用方法的时候,方法的主体不变,每次调用你发给发的参数不同,可以使用递归。

public static void main(String[] args) {
    a();
}
private static void a() {
    a(); // 直接递归,无限调用,栈溢出异常!
}

解释占内存溢出异常原因:

main方法压栈执行,调用a方法,继续压栈,。。。

举例:

1.斐波那契数列

/*
斐波那契数列
F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
 */
public class Demo13Fibonacci {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int n = sc.nextInt();
        if(n < 0){
            System.out.println("输入异常!");
        }else {
            System.out.println("结果为:" + a(n));
        }
    }

    private static int a(int n) {
        if(n == 0 || n == 1){
            return n;
        }else{
            return a(n - 1) + a(n - 2);
        }
    }
}

2.递归累加求和

/*
计算1~n的和
 */
public class Demo13Sum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要的数:(输入为空则停止)");
        while(sc.hasNext()){ // 循环键入
            int n = sc.nextInt();
            // if
            System.out.println("累加和为:" + sum(n));
        }
    }

    private static int sum(int n) {
        if(n == 1){ // 递归的结束条件
            return 1;
        }else{
            return sum(n - 1) + n;
        }
    }
}

如果仅仅是计算1-n之间的和,不推荐使用递归,会导致内存中有多个sum方法,效率低下,使用for循环即可。

3.递归求阶乘

public class Demo13Multiply {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要的数:");
        while(sc.hasNext()){ // 循环键入
            int n = sc.nextInt();
            System.out.println("累乘积为:" + sum(n));
        }
    }

    private static int sum(int n) {
        if(n == 1){ // 递归的结束条件
            return 1;
        }else{
            return sum(n - 1) * n;
        }
    }
}

4.打印多级目录

/*
练习:递归打印多级目录
需求:遍历D:\\a文件及,及a文件夹下的子文件夹
D:\\a
D:\\a\\a.txt
D:\\a\\aa.txt
D:\\a\\b
D:\\a\\b\\b.txt
D:\\a\\b\\bb.txt
D:\\a\\c
D:\\a\\c\\c.txt
D:\\a\\c\\cc.txt
 */
public class Demo13Recurison2 {
    public static void main(String[] args) {
        File dir = new File("D:\\a");
        getAllFile(dir);
    }
        /*
        定义一个方法,参数传递File类型的目录
         */
        public static void getAllFile(File dir){
            File[] files = dir.listFiles();
            for (File file : files) {
                System.out.println(file);
                if(file.isDirectory()){
                    getAllFile(file);
                }
            }
        }
}

打印截图:

相关文章:

  • FileFilter过滤器
  • LeetCode两数之和
  • 稀疏数组
  • 队列
  • 单链表LinkedList的增删改查
  • 双向链表和环形链表(单向和双向)约瑟夫环实例
  • IO流概述+字节输出流
  • 字节输入流
  • 字符流(字符输入流和字符输出流)
  • IO异常的处理
  • 栈Stack(数组模拟、单链表模拟)
  • 属性集合Properties
  • 缓冲流
  • 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
  • 序列化与反序列化和transient瞬态关键字
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2019.2.20 c++ 知识梳理
  • Android Studio:GIT提交项目到远程仓库
  • CSS相对定位
  • dva中组件的懒加载
  • Electron入门介绍
  • JAVA SE 6 GC调优笔记
  • Python语法速览与机器学习开发环境搭建
  • Terraform入门 - 1. 安装Terraform
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 二维平面内的碰撞检测【一】
  • 反思总结然后整装待发
  • 高程读书笔记 第六章 面向对象程序设计
  • 力扣(LeetCode)21
  • 微服务入门【系列视频课程】
  • 想写好前端,先练好内功
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​secrets --- 生成管理密码的安全随机数​
  • ​马来语翻译中文去哪比较好?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #include<初见C语言之指针(5)>
  • ${factoryList }后面有空格不影响
  • (007)XHTML文档之标题——h1~h6
  • (13):Silverlight 2 数据与通信之WebRequest
  • (4.10~4.16)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (WSI分类)WSI分类文献小综述 2024
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm码农论坛 毕业设计 231126
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET Core WebAPI中封装Swagger配置
  • .NET DataGridView数据绑定说明
  • .Net 路由处理厉害了
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET学习全景图
  • .php文件都打不开,打不开php文件怎么办
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?