递归算法JAVA实现
什么是方法递归?
方法调用自身的形式称为方法递归( 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实现相关推荐
- 递归算法-Java实现简单的递归操作
在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭 ...
- java5的递归算法_java递归算法 java面试题(5)
Java语言是一种具有动态性的解释型语言,类(class)只有被加载到JVM后才能运行.当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Ja ...
- Ackerman非递归算法Java实现
Ackerman递归方程 public int ackerman(int m,intn){ //m,n分别为acker的两个参数 Stack<Inte ...
- java算法概述,Java数据结构与算法基础(一)概述与线性结构
Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...
- java版 二叉树 所有递归和非递归遍历算法
[java] 通过数组构造二叉树,所有遍历算法以及求二叉树深度的递归算法 [java] import java.util.LinkedList; public class BinaryTree { ...
- 2015最新Android学习线路图
Android是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google和开放手持设备联盟开发与领导.据2011年初数据显示仅正式上市两年的操作系统Android已经跃居全球最受欢迎的 ...
- 搜索python设计题的微信公众号_appium+python自动化42-微信公众号 (可能以后会遇到也遇到切换不了webview的问题 记录再此 还没试)...
前言 本篇介绍如何在微信公众号上自动化测试,以操作我的个人公众号:yoyoketang为例,没关注的,先微信关注了,再跟着操作 环境准备: python 3.6 appium 1.7以上版本 微信6. ...
- java中的递归算法_java中的递归算法
import java.math.BigDecimal; /** * 递归计算1+2+3+...+100 * * @author dell * */ public class Test { publi ...
- Java实现折半查找(二分查找)的递归和非递归算法
Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: * 1.要求所查找的数组已有序,并且其 ...
- 递归算法介绍及Java应用实战
转载自 递归算法介绍及Java应用实战 什么是递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解.一个过程(或函数)直接或间接调用自己本身,这种过程 ...
最新文章
- php 过滤css样式,PHPCMS v9过滤采集内容中的CSS样式
- 怎样修改SSIS包中 Connection Manager 中的参数
- 关联规则(Association Rules)笔记
- linux运行rmp文件,linux 里rpm包到底是干什么用的啊?
- 【学习笔记】类对象的内存释放
- python向量机使用方法_Python中支持向量机SVM的使用方法详解
- outlook 搜索框_日程管理,用 Outlook 也行
- python 学习手册重点
- AJAX的 contentType
- Mybatisの常见面试题
- 2019年2月25日 Range Sum of BST
- 《黄聪:手机移动站SEO优化教程》4、如何实现手机移动网站和PC站点的自主适配...
- SQL Proc(存储过程)/tran(事物)
- 如果避免反射导致的性能问题?
- 博文视点 on Twitter
- [转] 背完这444句英语,你的口语绝对不成问题
- Codeforce432 Prime Swaps
- BZOJ1036[ZJOI2008] 树的统计
- 蔡司数码视疲劳测试软件_数码视觉疲劳,你不知道的蓝光
- MySQL-查询本周过生日的人-终极答案
热门文章
- 最简单的Qt配置opencv教程
- 在 uniapp 中使用 阿里巴巴矢量图标
- python倒三角代码_vb代码输出倒三角形 python倒三角代码
- GD32F103实战
- win10自学c语言用什么软件,VC++6.0软件安装使用(win10可用),送给需要学c语言的你...
- VS2017配置opencv-c++
- 饭店计算机软件系统FIDlLIL,酒店Opera系统研究
- 计算机 画图软件 快捷键大全,教你完整版电脑CAD快捷键大全
- Java 8实战-Stream 查找替换 VS 归约reduce
- tcs标准编写软件_tcs2010下载-tcs2010(中国标准编写模板) 免费版 - 河东下载站