什么是方法递归?

方法调用自身的形式称为方法递归( recursion)。

递归的形式

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

方法递归存在的问题?

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

如下面的直接递归和间接递归均是死循环,导致栈内存溢出:

//直接递归
public class Demo {public static void main(String[] args) {test();}public static void test(){System.out.println("递归");test();}
}
//间接递归
public class Demo {public static void main(String[] args) {test1();}public static void test1(){System.out.println("test1");test2();}public static void test2(){System.out.println("test2");test1();}
}

方法递归的应用、执行流程、递归算法的三个核心要素

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

分析:

①假如我们认为存在一个公式是 f(n) = 1*2*3*4*5*6*7*…(n-1)*n;
②那么公式等价形式就是: f(n) = f(n-1) *n
③如果求的是 1-5的阶乘 的结果,我们应该应用上述公式这样计算。

代码实现:

//计算1-n的阶乘
public class Exer {public static void main(String[] args) {System.out.println(f(5));}public static int f(int n){if(n == 1){return 1;}else{return f(n - 1) * n;}}}
递归算法三要素大体可以总结为:
递归的公式: f(n) =  f(n-1) * n;
递归的终结点:f(1)
递归的方向必须走向终结点:

递归经典案例:猴子吃桃问题

题目:

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

由递归算法三大要素分析:

1、递归公式:第二天吃了第一天的一半有多吃一个

f(x + 1) = f(x) -f(x)/2 -1  则 f(x) =  2 f(x+1) +2

2、递归的终结点: 等到第10天的时候发现桃子只有1个了

f(10) = 1

3、递归的方向走向终结点

代码实现:

public class Exer {public static void main(String[] args) {System.out.println(f(1));}public static int f(int x){if(x == 10){return 1;}else{return 2 * f(x + 1) + 2;}}
}

非规律化的递归问题,如文件搜索

需求:文件搜索、从某个盘中(此例题是F:盘)搜索出某个文件名称(此例题中QQScLauncher.exe)并输出绝对路径。

分析:

①先定位出的应该是一级文件对象
②遍历全部一级文件对象,判断是否是文件
③如果是文件,判断是否是自己想要的
④如果是文件夹,需要继续递归进去重复上述过程
代码实现:
public class RecursionDemo1 {public static void main(String[] args) {searchFile( new File("F:/"), "QQScLauncher.exe");}/***@Description   搜索某个目录下的全部文件,找到我们想要的文件*@Author Hmy*@date 2022/8/17 15:59*@Param [dir:被搜索的原目录, fileName:被搜索的文件名称]*@Return void*/public static void searchFile(File dir, String fileName){//判断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(fileName)){System.out.println("找到了,此文件在:" + file.getAbsoluteFile());//找到后,启动它Runtime r = Runtime.getRuntime();try {r.exec(file.getAbsolutePath());} catch (Exception e) {throw new RuntimeException(e);}}} else{//是文件夹,继续递归寻找searchFile(file, fileName);}}}}else{System.out.println("您当前搜索的位置不是文件夹!");}}
}

递归算法JAVA实现相关推荐

  1. 递归算法-Java实现简单的递归操作

    在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭 ...

  2. java5的递归算法_java递归算法 java面试题(5)

    Java语言是一种具有动态性的解释型语言,类(class)只有被加载到JVM后才能运行.当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Ja ...

  3. Ackerman非递归算法Java实现

    Ackerman递归方程 public int ackerman(int m,intn){                       //m,n分别为acker的两个参数 Stack<Inte ...

  4. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  5. java版 二叉树 所有递归和非递归遍历算法

    [java]  通过数组构造二叉树,所有遍历算法以及求二叉树深度的递归算法  [java] import java.util.LinkedList; public class BinaryTree { ...

  6. 2015最新Android学习线路图

    Android是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google和开放手持设备联盟开发与领导.据2011年初数据显示仅正式上市两年的操作系统Android已经跃居全球最受欢迎的 ...

  7. 搜索python设计题的微信公众号_appium+python自动化42-微信公众号 (可能以后会遇到也遇到切换不了webview的问题 记录再此 还没试)...

    前言 本篇介绍如何在微信公众号上自动化测试,以操作我的个人公众号:yoyoketang为例,没关注的,先微信关注了,再跟着操作 环境准备: python 3.6 appium 1.7以上版本 微信6. ...

  8. java中的递归算法_java中的递归算法

    import java.math.BigDecimal; /** * 递归计算1+2+3+...+100 * * @author dell * */ public class Test { publi ...

  9. Java实现折半查找(二分查找)的递归和非递归算法

    Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其 ...

  10. 递归算法介绍及Java应用实战

    转载自 递归算法介绍及Java应用实战 什么是递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解.一个过程(或函数)直接或间接调用自己本身,这种过程 ...

最新文章

  1. php 过滤css样式,PHPCMS v9过滤采集内容中的CSS样式
  2. 怎样修改SSIS包中 Connection Manager 中的参数
  3. 关联规则(Association Rules)笔记
  4. linux运行rmp文件,linux 里rpm包到底是干什么用的啊?
  5. 【学习笔记】类对象的内存释放
  6. python向量机使用方法_Python中支持向量机SVM的使用方法详解
  7. outlook 搜索框_日程管理,用 Outlook 也行
  8. python 学习手册重点
  9. AJAX的 contentType
  10. Mybatisの常见面试题
  11. 2019年2月25日 Range Sum of BST
  12. 《黄聪:手机移动站SEO优化教程》4、如何实现手机移动网站和PC站点的自主适配...
  13. SQL Proc(存储过程)/tran(事物)
  14. 如果避免反射导致的性能问题?
  15. 博文视点 on Twitter
  16. [转] 背完这444句英语,你的口语绝对不成问题
  17. Codeforce432 Prime Swaps
  18. BZOJ1036[ZJOI2008] 树的统计
  19. 蔡司数码视疲劳测试软件_数码视觉疲劳,你不知道的蓝光
  20. MySQL-查询本周过生日的人-终极答案

热门文章

  1. 最简单的Qt配置opencv教程
  2. 在 uniapp 中使用 阿里巴巴矢量图标
  3. python倒三角代码_vb代码输出倒三角形 python倒三角代码
  4. GD32F103实战
  5. win10自学c语言用什么软件,VC++6.0软件安装使用(win10可用),送给需要学c语言的你...
  6. VS2017配置opencv-c++
  7. 饭店计算机软件系统FIDlLIL,酒店Opera系统研究
  8. 计算机 画图软件 快捷键大全,教你完整版电脑CAD快捷键大全
  9. Java 8实战-Stream 查找替换 VS 归约reduce
  10. tcs标准编写软件_tcs2010下载-tcs2010(中国标准编写模板) 免费版 - 河东下载站