Java中的方法递归

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

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

  • 方法递归注意事项
    递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象。

  • 递归算法三要素
    递归的公式
    递归的终结点
    递归的方向必须走向终结点

通过一些经典案例,加深对方法递归的思想。

文章目录

  • Java中的方法递归
    • 一、有规律的递归
      • 1.求1-n的和
      • 2.猴子吃桃问题
    • 二、无规律的递归
      • 啤酒问题
    • 三、递归扩展应用
      • 文件搜索

一、有规律的递归

1.求1-n的和


分析:
此求和问题, 计算方法 f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …(n-1) + n,含有一定的规律,可总结为:

  1. 递归公式: f(n) = f(n-1) + n
  2. 递归终结点:f(1) = 1
  3. 递归方向:走向终结点 f(1) 的方向
  4. 如果求1-5的和 的结果,递归思想——先递深,在归回
public class Demo1 {public static void main(String[] args) {System.out.println("1-5的和为:"+sum(5));}//递归求和private static int sum(int n) {if ( n == 1){return 1;}else {return sum(n-1)+n;}}
}

运行结果:

1-5的和为:15Process finished with exit code 0

2.猴子吃桃问题


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

  1. 递归公式: f(n+1) =1/2 f(n) - 1
    化简可得 f(n) = 2f(n+1) + 2
  2. 递归终结点: f(10)
  3. 递归方向:走向终结点 f(10) 的方向
public class Demo2 {public static void main(String[] args) {System.out.println("一共有"+fun1(1)+"个桃子");}//计算桃子数量private static int fun1(int n) {if (n == 10){return 1;}else {return fun1(n+1)*2+2;}}
}

运行结果

一共有1534个桃子Process finished with exit code 0

二、无规律的递归

啤酒问题


分析:
啤酒问题,并不是有规律的计算问题。但是,喝完之后的空瓶、盖子又可以换啤酒,变相来看,又是有规律的计算问题。
解决此类问题,可以将空瓶、盖子转换为金钱问题,转换思想,就是花钱买酒,将复杂的货物交换,转换为简单统一的金钱交换问题,易于解题。

public class Demo3 {//定义静态成员变量进行统计最后买的啤酒,默认为0public static int totalNumber;     //记录买的啤酒public static int totalButtle;    //记录上次剩余的瓶子个数public static int totalCover;    //记录上次剩余的盖子个数public static void main(String[] args) {buy(10);}/*** 进行买啤酒* @param money*/private static void buy(int money) {int buyNumber = money/2;totalNumber += buyNumber;//记录当前的瓶子个数、盖子个数int buttle = totalButtle + buyNumber;int cover = totalCover + buyNumber;//将当前的瓶子和盖子转换为金钱,利用递归再次购买啤酒int allMoney = 0;//先判断瓶子和盖子的个数是否满足可以兑换的数量,if (buttle >= 2){allMoney += (buttle/2) * 2;}if (cover >= 4){allMoney += (cover/4) * 2;}//并计算当前剩余的瓶子和盖子的数量totalButtle = buttle % 2;totalCover = cover % 4;//进行判断是否进行递归操作if (allMoney >= 2){buy(allMoney);}else {System.out.println(totalNumber+"瓶酒\t\t"+totalButtle+"个瓶子\t\t"+totalCover+"个盖子");}}
}

运行结果:

15瓶酒     1个瓶子        3个盖子Process finished with exit code 0

三、递归扩展应用

文件搜索


分析:
在对指定文件进行搜索,当我们并不知道指定文件在哪里时,搜索该文件方案是打开当前磁盘,找到所有的文件进行查找;未找到,则从第一个文件夹,一个个打卡进行查找,没有则退出,进入下一个文件,以此类推。

  1. 先定位出的应该是一级文件对象
  2. 遍历全部一级文件对象,判断是否是文件
  3. 如果是文件,判断是否是自己想要的
  4. 如果是文件夹,需要继续递归进去重复上述过程
/*** 进行查找磁盘中的一个指定文件的绝对路径* E:\Java\快捷键.md*/
public class Demo4 {public static void main(String[] args) {//一个磁盘,一个文件名searchFile(new File("E:/"),"快捷键.md");}/*** 进行文件的查找,并输出其文件的绝对路径* @param dir       当前查找的目录/文件夹* @param fileName   所要查找的文件名*/private static void searchFile(File dir, String fileName) {//进行判断目录是否为空 或者不是一个目录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(fileName+"文件的绝对路径为:"+file.getAbsolutePath());}}else {searchFile(file,fileName);}}}}else {System.out.println("该文件不是一个目录,或者该目录为空!!!!");}}
}

运行结果

快捷键.md文件的绝对路径为:E:\Java\快捷键.mdProcess finished with exit code 0

注意:文件搜索中利用递归的技术,listFiles只能搜索到一级文件对象

[Java]方法递归——经典案例相关推荐

  1. 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题

    方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...

  2. Java继承多态经典案例分享

    今天动力节点java培训机构小编为大家分享Java继承多态经典案例,希望通过此文能够帮助到大家,下面就随小编一起看看Java继承多态经典案例. public class A { public Stri ...

  3. Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略

    Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介.使用方法.经典案例之详细攻略 目录 *args和**kwargs(设计不同数量的参数函数)的简介 1 ...

  4. Python语言学习之图表可视化:python语言中可视化工具包的简介、安装、使用方法、经典案例之详细攻略

    Python语言学习之图表可视化:python语言中可视化工具包的简介.安装.使用方法.经典案例之详细攻略 目录 python语言中可视化工具包的简介 python语言中可视化工具包的安装 pytho ...

  5. Graphviz:可视化工具Graphviz的简介、安装、使用方法、经典案例之详细攻略

    Graphviz:可视化工具Graphviz的简介.安装.使用方法.经典案例之详细攻略 目录 Graphviz的简介 Graphviz的安装 Graphviz的使用方法 Graphviz的经典案例 G ...

  6. ML之LIME:可解释性之SP-LIME的简介、原理、使用方法、经典案例之详细攻略

    ML之LIME:可解释性之SP-LIME的简介.原理.使用方法.经典案例之详细攻略 目录 SP-LIME简介-Submodular Pick LIME子模挑选 1.Submodular优化过程 Sub ...

  7. 高中数学必修二立体几何中的向量方法(经典案例讲解)

    高中数学必修二立体几何中的向量方法介绍,关于立体几何基础知识梳理,通过三个经典案例介绍立体几何易错点. 一.立体几何基础知识梳理 1.空间向量与空间角的关系 二.立体几何辨明两个易误点 三.经典案例解 ...

  8. 汉诺塔python创新设计_递归经典案例汉诺塔 python实现

    最近在廖雪峰大神的教程学习python 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法.这markdown编辑器还不怎么会 ...

  9. java逻辑循环经典案例(不死神兔、百钱百鸡、逢七过、评委打分、数组翻转)

    1减肥计划: 星期一:跑步: 星期二:游泳; 星期三:慢走; 星期四:动感单车 星期五:拳击 ;星期六:爬山; 星期日:好好吃一顿. import java.util.Scanner; /*减肥计划: ...

  10. 免费有效站外推广方法(附录经典案例)

    第一个:论坛 我想有很多卖家都喜欢逛论坛,例如猫扑,天涯等等,都可以在里面做店铺的推广,同时也可以把自己的论坛签名该成自己的店铺促销信息,记得带上连接. 第二个:微博 目前微博推广非常的火爆,微博推广 ...

最新文章

  1. Web开发经验谈之F12开发者工具/Web调试[利刃篇]
  2. mgr在mysql中指是什么字段_MySQL MGR
  3. linux 内核头文件 linux kernel header
  4. 变更管理、信息系统安全管理、项目风险管理
  5. SQL Server中删除重复数据的2个方法
  6. 学excel还是学python_已经会Excel了还需要学python吗?
  7. 实现自己的控制层do-c (仿Struts2和SpringMVC)(六)
  8. 9.docker commit
  9. 前端晋升答辩-性能优化篇范式
  10. 一个app项目如何从想法一步一步落地?有哪些必要的流程?
  11. vb.net多线程例子
  12. 运算电路的基本定义和运算电路经典基本电路图
  13. 小米其实已在悄悄涨价了,用户反应不一
  14. Open3D点云处理
  15. 使用函数节流思想避免 SAP UI5 应用里按钮短时间内被高频重复点击试读版
  16. 基于SSH的校园二手物品交易系统
  17. Dell电脑 U盘启动盘 安装ubuntu
  18. Task3:Selenium模块学习及丁香园模拟登录爬取留言板
  19. 新零售模式,数据管理更轻松
  20. Autodesk Maya 2014-2020安装说明

热门文章

  1. 计算机组成原理——课程设计
  2. 使用Python绘制淘宝商品评论词云图
  3. 8021x 获取IP信息失败,请检查锐捷认证客户端当前配置是否符合所在网络的要求,检查完毕后尝试重新认证...
  4. 利用计算机计算问题的案例,两个基于计算思维培养的高中信息技术教学案例
  5. 国内博客搬家工具大全
  6. oracle 10g 下载方法
  7. 《高性能mysql第三版》
  8. 高中计算机编程软件vb,高中年级VB程序设计全套教案.doc
  9. 蚂蚁区块链第1课 蚂蚁10大区块链解决方案及应用场景
  10. Java项目演示第23期在线购书商城系统