Java方法递归的形式和常见递归算法-方法递归结合File类查找文件

这篇具有很好参考价值的文章主要介绍了Java方法递归的形式和常见递归算法-方法递归结合File类查找文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方法递归

方法递归的形式

什么是方法递归?

方法直接调用自己或者间接调用自己的形式称为方法递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。

递归的形式:

直接递归:方法自己调用自己。

public static void main(String[] args) {
    test();
}

// 定义一个方法
public static void test() {
    // 直接递归方法内部调用自己
    test();
}

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

public static void main(String[] args) {
    test1();
}

public static void test1 () {
    // 间接递归, 方法内部调用其他方法, 其他方法再调用此方法
    test2();
}

private static void test2() {
    test1();
}

递归存在的问题?

递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象。

递归常见的算法

递归案例导学-计算1-n的阶乘:

需求:

  • 计算1-n的阶乘的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点。

分析:

  • 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

  • 假如我们认为存在一个公式是 f(n) = 1234567*…(n-1)*n;

  • 那么公式等价形式就是: f(n) = f(n-1) *n

  • 如果求的是 1-5的阶乘 的结果,我们手工应该应该如何应用上述公式计算:

  • f(5) = f(4) * 5
    f(4) = f(3) * 4
    f(3) = f(2) * 3
    f(2) = f(1) * 2
    f(1) = 1

  • 当f(1)时作为条件退出递归

示例代码:文章来源地址https://www.toymoban.com/news/detail-797391.html

public static void main(String[] args) {
    System.out.println(f(5));
}

public static int f(int num) {
    if (num == 1) {
        return 1;
    } else {
        return num * f(num - 1);
    }
}

递归案例导学-计算1-n的和

需求:

  • 计算1-n的和的结果,使用递归思想解决,我们先从数学思维上理解递归的流程和核心点。

分析:

  • 假如我们认为存在一个公式是 f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …(n-1) + n;

  • 那么公式等价形式就是: f(n) = f(n-1) + n

  • 递归的终结点:f(1) = 1

  • 如果求的是 1-5的和 的结果,应该如何计算。

  • f(5) = f(4) + 5
    f(4) = f(3) + 4
    f(3) = f(2) + 3
    f(2) = f(1) + 2
    f(1) = 1

示例代码:

public static void main(String[] args) {
    System.out.println(sum(100));
}

public static int sum(int num) {
    if (num == 1) {
        return 1;
    } else {
        return num + sum(num - 1);
    }
}

案例导学-猴子吃桃问题:

猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个; 第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个; 以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个; 等到第10天的时候发现桃子只有1个了。

需求:

  • 请问猴子第一天摘了多少个桃子?

分析:

  • 整体来看,每一天都是做同一个事件,典型的规律化问题,考虑递归三要素:

  • 递归公式(例如第一天桃子的总数用f(n)表示, f(n+1)代表第二天):

    f(n) - f(n)/2 - 1 = f(n+1) 变形可得: f(n)= 2f(n+1) + 2

  • 递归终结点:f(10) = 1

难点: 使用数学思想, 推导出递归公式

示例代码:

public static void main(String[] args) {
    System.out.println(foo(1));
}

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

非规律递归案例

在上述的案例中递归算法都是针对存在规律化的递归问题。

有很多问题是非规律化的递归问题,比如文件搜索。如何解决?

  • 非规律化递归问题自己看着办,需要流程化的编程思维。

案例导学-文件搜索:

需求:

  • 从电脑某一路径下,搜索出某个文件名称并输出绝对路径。

分析:

  • 先定位出的应该是一级文件对象
  • 遍历全部一级文件对象,判断是否是文件
  • 如果是文件,判断是否是自己想要的
  • 如果是文件夹,需要继续递归进去重复上述过程

示例代码:

public class RecursionDemo5 {
    public static void main(String[] args) {
        findFile("demo2.txt", new File("/Users/chenyq/Documents/file_test"));
    }

    /**
     * @param name 搜索的文件名
     * @param dir 搜索的目录
     * @return
     */
    public static void findFile(String name, File dir) {
        // 判断目录是否为空
        if (dir != null && dir.isDirectory()) {
            // 获取目录下的一级文件数组
            File[] files = dir.listFiles();
            // 判断数组是否有内容
            if (files != null && files.length > 0) {
                // 不为空则遍历数组
                for (File file : files) {
                    // 判断是文件还是文件夹
                    if (file.isFile()) {
                        // 判断当前文件是否是要查找的文件
                        if (file.getName().contains(name)) {
                            System.out.println("文件路径是: " + file.getAbsolutePath());
                            return;
                        }
                    } else {
                      	// 递归查找子目录
                        findFile(name, file);
                    }
                }
            }
        } else {
            System.out.println("请输入正确的目录!");
        }
    }
}

到了这里,关于Java方法递归的形式和常见递归算法-方法递归结合File类查找文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java -- File类和递归

    java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File类将文件,文件夹和路径封装成了对象,提供大量的方法来操作这些对象。 绝对路径 :从 盘符 (Windows)或\\\" / \\\"(Linux)开始的路径,这是一个完整的路径,绝对路径具有唯一性 相对

    2023年04月16日
    浏览(31)
  • 二叉排序树的定义及基本操作(构造、查找、插入、删除)递归及非递归算法

    二叉排序树(Binary Sort Tree, BST),也称二叉查找树。 二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树: 1) 若左子树非空,则左子树上所有结点均小于根结点的值; 2) 若右子树非空,则右子树上所有结点均大于根结点的值;

    2024年02月08日
    浏览(58)
  • 算法题:203. 移除链表元素(递归法、设置虚拟头节点法等3种方法)Java实现创建链表与解析链表

    讲一下设置虚拟头节点的那个方法,设置一个新节点指向原来链表的头节点,这样我们就可以通过判断链表的当前节点的后继节点值是不是目标删除值,来判断是否删除这个后继节点了。如果不设置虚拟头节点,则需要将头节点和后面的节点分开来讨论,代码会复杂一点。

    2024年02月05日
    浏览(36)
  • 快速排序算法(递归非递归,三种方法实现,优化)

    快速排序 代码实现 ⚪单趟排序 版本一 ⚪快速排序 递归 关于快排优化 ⚪单趟排序 版本二 ⚪单趟排序 版本三 ⚪快速排序 非递归 特性总结 快速排序作为效率相对较高的排序,分别有递归与非递归两种写法,但都是 进行单趟排序,随后再解决其余问题。 快速排序的平均时间

    2024年02月05日
    浏览(42)
  • Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)

    🔥博客主页:  小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍     文章目录         1.0 递归的说明         2.0 用递归来实现相关问题         2.1 递归 - 阶乘         2.2 递归 - 反向打印字符串         2.3 递归 - 二分查找         2.4 递归 - 冒泡排序         2.5 递归

    2024年02月05日
    浏览(38)
  • Java数据结构与算法:查找算法之二分查找

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,欢迎回到本专栏。在这个冰冷的季节里,我们将一同探讨Java中一种高效的查找算法——二分查找。让我们点燃知识的火花,一同解锁这个查找奇迹的秘密! 二分查找简介 二分查找,也称为折半查找,

    2024年01月21日
    浏览(45)
  • 二分查找的两种形式(C++实现)

    现在有一个这样的问题需要求解 题目要求:给定一个n个元素的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1 示例 继上次写完二分查找后,又在网上查看了其他资料,发现二分查找其实常用的有两种写法,这篇

    2024年02月03日
    浏览(47)
  • 【Java】递归算法

          程序 调用自身 的编程技巧成为 递归(recursion) 。 递归算法是一种直接或间接调用、定义自身的函数或方法的算法,也就是调用自身。 递归的实质:将原问题不断分解为规模缩小的子问题,然后用递归调用的方法来表示问题的解; 递归,顾名思义就是 递 和 归 的

    2024年02月13日
    浏览(42)
  • Java递归算法

    程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。Java支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 一个物理世界的实例是放置两个彼此面对的平行反射镜。它们之间的任何对象都

    2024年02月15日
    浏览(49)
  • 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

    预测效果 基本介绍 MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测,输出为选择的特征序号 Chinese: Options:可用的选项即表示的涵义如下 -s svm类型:SVM设置类型(默认0) 0 – C-SVC 1 --v-SVC 2 – 一类SVM 3 – e -SVR 4 – v-SVR -t 核函

    2024年02月14日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包