我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java方法递归的形式和常见递归算法代码分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java方法递归的形式和常见递归算法代码分析

本篇内容介绍了“Java方法递归的形式和常见递归算法代码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

方法递归

方法递归的形式

什么是方法递归?

方法直接调用自己或者间接调用自己的形式称为方法递归( 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)时作为条件退出递归

示例代码:

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"));    }        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方法递归的形式和常见递归算法代码分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java方法递归的形式和常见递归算法代码分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java方法递归的形式和常见递归算法代码分析

本篇内容介绍了“Java方法递归的形式和常见递归算法代码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法递归方法递归的形式什么是方法递
2023-07-05

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

方法递归方法直接调用自己或者间接调用自己的形式称为方法递归(recursion),递归做为一种算法在程序设计语言中广泛应用,这篇文章主要介绍了Java方法递归的形式和常见递归算法-方法递归结合File类查找文件,需要的朋友可以参考下
2023-02-28

Android中关于递归和二分法的算法实例代码

// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1。package demo; public class Mytest { public static void main(String[
2022-06-06

Java中方法的使用、重载与递归的示例分析

这篇文章主要介绍了Java中方法的使用、重载与递归的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.方法的基本使用1.什么是方法方法是一个代码片段,类似于C语言中的
2023-06-25

递归在 C++ 算法中的应用:效率提升和复杂度分析

递归在 c++++ 算法中的应用可以提升效率。以斐波那契数列计算为例,函数 fibonacci 递归调用自身,复杂度为 o(2^n)。然而,对于树形结构等递归问题,递归可以大幅提升效率,因为每个问题的规模减半。但要注意避免无限递归和堆栈空间
递归在 C++ 算法中的应用:效率提升和复杂度分析
2024-04-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录