前置知识:方法递归

认识递归的形式

  • 递归是一种算法,在程序设计语言中广泛应用。
  • 从形式上来说:方法调用自身的形式称为方法递归(recursion)。

递归的形式

  • 直接递归:方法自己调用自己
  • 间接递归:方法调用其他方法,其他方法又回调方法自己

使用方法递归时需要注意的问题:

  • 递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误(StackOverflowError)

应用、执行流程、算法思想

案例导学-计算n的阶乘

需求:

        计算n的阶乘,5的阶乘=1*2*3*4*5;6的阶乘=1*2*3*4*5*6;

public class Test {
    public static void main(String[] args) {
        System.out.println("5的阶乘是:" + f(5));
    }

    private static int f(int n) {
        if (n == 1){
            return 1;
        }else {
            return f(n - 1) * n;
        }
    }
}

递归算法三要素:

  • 递归的公式:f(n )= f(n-1)*n;
  • 递归的终结点:f(1);
  • 递归的方向必须走向终结点。

案例:猴子吃桃问题

public class Test {
    public static void main(String[] args) {
        System.out.println("猴子第一天摘的桃子数为:" + f(1));
    }

    public static int f(int n){
        if (n == 10){
            return 1;
        }else {
            return 2 * (f(n + 1) +1);
        }
    }
}

其他应用:文件搜索

案例:

需求:从D:盘中,搜索“QQ.exe”这个文件,找到后直接输出其位置。

分析:
  1. 先找出D:盘下所有一级文件对象
  2. 遍历全部一级文件对象,判断是否是文件
  3. 如果是文件,判断是否是自己想要的
  4. 如果是文件夹,需要继续进入到该文件夹,重复上述操作
import java.io.File;

public class Test {
    public static void main(String[] args) {
       searchFile(new File("D:/"),"QQ.exe");
    }

    /**
     * 去目录下搜寻某个文件
     * @param dir 目录
     * @param fileName 要搜索的文件名称
     */
    private static void searchFile(File dir, String fileName) {
        // 把非法的情况都拦截住
        if (dir == null || !dir.exists() || dir.isFile()){
            return; // 代表无法搜索
        }

        // dir不是null,且存在,一定是目录
        // 获取当前目录下的全部一级文件对象
        File[] files = dir.listFiles();

        // 判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象
        if (files != null && files.length > 0){
            // 遍历全部一级文件
            for (File file : files) {
                // 判断文件是否是文件,还是文件夹
                if (file.isFile()){
                    // 是文件,判断这个文件是否是我们要找的
                    if (file.getName().contains(fileName)){
                    System.out.println("找到了:" + file.getAbsolutePath());
                    }
                }else {
                    // 是文件夹,继续重复这个过程(递归)
                    searchFile(file,fileName);
                }
            }
        }
    }
}

练习:删除非空文件夹

import java.io.File;

public class Test {
    public static void main(String[] args) {
       // 目标:删除非空文件夹,独立功能独立非法
        File dir = new File("D:\\resource\\文档");
        deleteDir(dir);
    }

    private static void deleteDir(File dir) {
        if (dir == null || !dir.exists()){
            return;
        }
        if (dir.isFile()){
            dir.delete();
            return;
        }

        // dir存在且是文件夹,获取里面的一级文件对象
        File[] files = dir.listFiles();
        if (files == null){
            return;
        }
        // 这是一个有内容的文件夹,干掉里面的内容,再干掉自己
        for (File file : files) {
            if (file.isFile()){
                file.delete();
            }else {
                deleteDir(file);
            }
        }
        dir.delete();
    }
}

案例:啤酒问题,啤酒2元一瓶,4个盖子可以换一瓶,2个瓶子可以换一瓶,请问10元能换多少瓶酒

public class Test {
    public static int totalNumber; //总酒数
    public static int lastBottleNumber; //剩余酒瓶数
    public static int lastCoverNumber; //剩余瓶盖数
    public static void main(String[] args) {
        buy(10);

        System.out.println("总共可以喝的瓶数为:" + totalNumber);
        System.out.println("剩余酒瓶数:" + lastBottleNumber);
        System.out.println("剩余瓶盖数:" + lastCoverNumber);
    }

    private static void buy(int money) {
        int buyNumber = money / 2;
        money = money % 2;
        totalNumber += buyNumber;

        int allBottleNumber = lastBottleNumber + buyNumber;
        int allCoverNumber = lastCoverNumber + buyNumber;

        int allMoney = 0;

        if (allBottleNumber >= 2){
            allMoney += (allBottleNumber / 2) * 2;
        }
        lastBottleNumber = allBottleNumber % 2;

        if (allCoverNumber >= 4){
            allMoney += (allCoverNumber / 4) * 2;
        }
        lastCoverNumber = allCoverNumber % 4;

        allMoney += money;
        if (allMoney >= 2){
            buy(allMoney);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/363747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解读NVMe计算存储协议-1

随着云计算、企业级应用以及物联网领域的飞速发展,当前的数据处理需求正以前所未有的规模增长,以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大,并对主机计算资源(如内存和CPU)造成极大负担,进…

ASP.NET Core+Layui使用EF Core操作MySQL实战

一、创建ASP.NET Core Web应用程序 注意,本章节主要以ASP.NET Core 3.1版本作为博客的示例实例模板!(当然你也可以使用当前最新的.NET版本进行实操)。 二、添加EF Core NuGet包 若要在项目中使用EF Core操作MySQL数据库&#xff…

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

坚持刷题 | 完全二叉树的节点个数

Hello,大家好,我是阿月!坚持刷题,老年痴呆追不上我,今天刷:完全二叉树的节点个数 题目 222.完全二叉树的节点个数 代码实现 class TreeNode {int val;TreeNode left, right;public TreeNode(int val) …

编程实例分享,配件进销存进出库管理系统软件

编程实例分享,配件进销存进出库管理系统软件 一、前言 以下教程以 佳易王配件进出库管理系统软件V16.0为例说明 如上图,左侧为导航栏,分为 系统设置,用户信息设置,出入库开单,统计报表,财务管…

C++初阶 类和对象(补充)

目录 一、友元 1.1什么是友元? 1.2如何使用友元? 1.3使用友元 1.4使用友元注意事项 二、初始化列表 2.1什么是初始化列表? 2.2为什么要有初始化列表? 2.3使用初始化列表 2.4注意事项 一、友元 1.1什么是友元? 友元是一…

基于MobileNet(v1-v3)全系列不同参数量级模型开发构建果树图像病虫害识别分析系统,实验量化对比不同模型性能

最近正好项目中在做一些识别相关的内容,我也陆陆续续写了一些实验性质的博文用于对自己使用过的模型进行真实数据的评测对比分析,感兴趣的话可以自行移步阅读即可: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、…

高等数学:积分

本文主要参考: 【建议收藏】同济七版《高等数学》精讲视频 | 期末考试 | 考研零基础 | 高数小白_哔哩哔哩_bilibili 4.1.1.1 定积分引例_哔哩哔哩_bilibili 仅供本人学习使用。 积分是一个在多个领域都广泛使用的概念,特别是在数学和物理学中。 以下是积…

PyTorch识别验证码

## 一、生成测试集数据pip install captcha common.py import random import time captcha_array list("0123456789abcdefghijklmnopqrstuvwxyz") captcha_size 4from captcha.image import ImageCaptchaif __name__ __main__:for i in range(10):image ImageC…

leetcode209长度最小的子数组|滑动窗口算法详细讲解学习

滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。 分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。 简而言之,滑动窗口算法在一个特定大小的字符串或数组上进行操作&…

如何使用Cloudreve搭建私有云盘并发布公网访问无需购买域名服务器

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

飞轮储能系统的建模与MATLAB仿真(永磁同步电机作为飞轮驱动电机)

目录 1 主要内容 电网侧控制系统 电机侧模型 模型二 2 结果分析 3 下载链接 1 主要内容 该仿真为飞轮储能系统的建模,包括电网侧和电机侧两部分模型,仿真采用永磁同步电机作为飞轮驱动电机,通过矢量控制的方式对其发电和电动的工况进行控…

基于单片机温度控制系统的研究

摘 要:笔者基于单片机的温度控制系统,从单片机选择、传感器选择、系统框架设计等方面概述了单片机的温度控制系统内涵,分析了其运行原理,列举了单片机温度控制系统设计的实操方法,从硬件系统、软件系统、温度检测方法…

Python武器库开发-武器库篇之zip文件暴力破解(五十一)

Python武器库开发-武器库篇之zip文件暴力破解(五十一) Zip文件是一种常用的存档文件格式,用于将多个文件和文件夹压缩成一个单独的文件。它是一种广泛接受和支持的文件格式,几乎所有操作系统和计算机都能够处理Zip文件。Zip文件使用一种压缩算法来减小文…

sqli-labs靶场第一关详解

目录 sqlilabs靶场第一关 0. sql注入解释 0.1什么是sql注入 0.2sql注入的原理 0.3sql注入方法 0.3.1 数字型注入 0.3.2 字符型注入 1.注入第一步判断请求方式、类型 1.1打开我自己本地的靶场http://sql.com/Less-1/ (上一期靶场搭建:http://t.…

nodejs+vue+ElementUi电商购物个性化商城推荐系统gqfe

电本电商个性化推荐系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户和管理员这二者的需求。操作简单易懂,合理分析各个模块的功能,尽可能优…

git将项目的某次签入遴选(Cherry-Pick)另一个项目

需求&#xff1a;将项目Product&#xff0c;分支feature/platform&#xff0c;签入959294ce6b75ee48c5cb22c46d7398654628a896&#xff0c;遴选到项目BRP&#xff0c;分支dev 第一步&#xff1a;使用原签入生成patch文件&#xff08;git format-patch -1 <commit_hash>&a…

MySQL原理(一)架构组成之物理文件组成

目录 一、日志文件 1、错误日志 Error Log 1.1、作用&#xff1a; 1.2、开启关闭&#xff1a; 1.3、使用 2、二进制日志 Binary Log & Binary Log Index 2.1、作用&#xff1a; 2.2、开启关闭&#xff1a; 2.3、Binlog还有一些附加选项参数 &#xff08;1&#x…

Linux系统-学习

文章目录 Linux系统-学习 1、自由开源 Linux操作系统完全免费且可用作开源软件&#xff0c;通过开源方式&#xff0c;您可以轻松查看用于创建Linux内核的可用代码&#xff0c;还可以修改代码以修复任何错误等。它提供有许多编程接口&#xff0c;您甚至可以开发自己的程序并将其…

2.1总结

还是一样水更一天&#xff0c;就随便做了几个题&#xff0c;有一个周期有点长&#xff0c;后面更一篇长的 随手刷的一道水题&#xff0c;就不往今天的行程单添了 问题&#xff1a;最大公约数 题解&#xff1a;题目太水了&#xff0c;就是求三个数&#xff0c;其中两组的最大公…