在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做“递归”,这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的。虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于一些比较抽象复杂的算法不用递归很难理解与实现。
递归分为直接递归和间接递归,就简单分享一下两个小的直接递归。
对于递归的概念,其实你可以简单的理解为自己定义自己,记得小时候看过一部电视剧《狼毒花》,里面主角叫做“常发”,但是个文盲,老师问他叫什么,他说“常发”。“哪个常?”“常发的常啊!”“哪个发?”“常发的发啊!”结果第二节课老师就让一群小朋友一起喊“常发的常,常发的发,傻瓜的傻,傻瓜的瓜”。言归正传,显然在多数情况下递归是解释一个想法或者定义的一种合理方法。在思想上递归类似于数学中曾经学过的数学归纳法。
递归的实现:
递归的实现要注意有两点:一个递归的选项和一个非递归的选项,后者成为基础情形(base case)。基础情形是递归的终结情形,没有基础情形或者处理不好都会导致无穷递归,这是我们不想要的结果。递归实现起来最关键的是处理好基础情形。 结合具体事例在说一下递归回溯的过程。
下边来写两个小程序:
1、爬楼梯算法:已知一个楼梯有n个台阶,每次可以选择迈上一个或者两个台阶,求走完一共有多少种不同的走法。
方法如下:

递归函数有返回值的比没有返回值的麻烦一点,因为一个函数只有一个返回值,但是递归还要求有基础情形的存在,所以还必须有if判断来终止递归。所以在每一个if或者else后边都有一个return,这样保证函数在任何一种情况下都有且仅有一个返回值。
分析一下这个算法:
A:如果有0个台阶,那么有0种走法,这个不用多说;
B:如果有1个台阶,那么有1种走法;
C:如果有2个台阶,那么有2种走法(一次走1个,走两次;一次走两个);
以上的B和C就是基础情形。
D:接下来就是递归了,如果台阶数目多于2个,那么首先第一步就有两种选择:第一次走1个,或者第一次走两个。这样除了第一次后边的走法就有了两种情形:climbStairs(n-1)和climbStairs(n-2)。这样一直递归下去,直到出现到了基础情形(即n=1或n=2的情形),递归到这个地方(基础情形),然后开始回溯 ,这就是所说的和递归密切相关的“回溯”了。回溯,顾名思义就是从结果倒着回去,找到整个过程,进而分析这个路径或者说是实现的过程。

需要注意的是,这个算法实现思路上简单,但是复杂度并没有降低,还牵扯回溯保存堆栈问题(其实递归的设计尽量避免这种嵌套两个的递归方式(climb(n)中包含climb(n-1)和climb(n-2)),这种操作会使得堆栈开辟空间随着n的增大以指数型增长,最终程序很容易崩溃),而且在台阶数目多到一定数量的时候会越界(走法次数会超出int的范围),所以递归程序很大程度上就是思想实现设计上简单理解一些。
下边是源代码:

package leetcode;public class ClimbStairs {
//  **************************************************************public int climbStairs(int n) {int i=1;if(n<=0)return 0;if(n==1){return i;}if(n==2){i++;return i;}elsereturn climbStairs(n-1)+climbStairs(n-2);}
//**************************************************************public static void main(String []args){ClimbStairs cs=new ClimbStairs();int a =cs.climbStairs(4);System.out.println(a);}}

然后还有几个比较典型的递归问题:比如说迷宫问题,或者最经典的汉诺塔问题,下边都给出源码,大家一块儿学习一下。

汉诺塔问题:一次只能移动一个盘子;不能把大盘子放在小盘子上;除去盘子在两个柱子之间移动的瞬间,盘子必须都在柱子上。(在这三点要求下把盘子从起始柱子A全部移动到目标柱子C上)

代码如下:
基础情形:n==1的时候终止递归,进行回溯。

public class HanNuoTower {public void tower(int n,char s,char m,char e)//n个塔从s经过m最终全部移动到e{if(n==1)move(s,e);else{tower(n-1,s,e,m);move(s,e);tower(n-1,m,s,e);}}public void move(char s,char e){System.out.println("move "+s+" to "+e);}public static void main(String []args){HanNuoTower hnt =new HanNuoTower();hnt.tower(4,'A','B','C');}}

迷宫走法:二维数组构成一个迷宫,1表示通路,0表示不通,找到一条路径从起始点(traverse函数的参数)到终点(右下角点)。

基础情形:row=grid.length-1&&column=grid[0].length-1时done=true;


public class Maze {private final int TRIED=3;private final int PATH=7;private int [][] grid={    {1,1,1,0,0,1,0,1,0,0},{0,0,1,1,1,0,0,0,0,0},{1,0,1,0,0,0,1,1,1,1},{1,1,1,1,1,0,0,0,1,1},{0,0,0,0,1,1,1,0,0,0},{1,0,1,0,1,0,0,1,0,0},{1,0,0,1,1,1,1,1,1,1}       };public boolean traverse(int row,int column){boolean done =false;if(valid(row,column)){grid[row][column]=TRIED;if(row==grid.length-1&&column==grid[0].length-1)done=true;else{done=traverse(row+1,column);//downif(!done)done=traverse(row,column+1);//rightif(!done)done=traverse(row-1,column);//upif(!done)done=traverse(row,column-1);//left}if(done)grid[row][column]=PATH;}return done;}private boolean valid(int row,int column){boolean result=false;if(row>=0&&row<grid.length&&column>=0&&column<grid[row].length)if(grid[row][column]==1)result=true;return result;}public String toString(){String result="\n";for (int row=0;row<grid.length;row++){for(int column=0;column<grid[row].length;column++){result +=grid[row][column]+" ";}result+="\n";}return result;}public static void main (String []args){Maze maze=new Maze();System.out.println(maze);if(maze.traverse(0, 0))System.out.println("The maze was successfully travelled!");elseSystem.out.println("There is no possible path.");System.out.println(maze);}}

还有一个九连环的操作,有兴趣的话可以一起看看。Java递归解决九连环问题
如有不得当之处,还望诸位大神指教!

Java实现简单的递归操作相关推荐

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

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

  2. 用JAVA实现简单的绘画操作

    用JAVA实现简单的绘画操作 1.基本操作 2.画板类 3.彩蛋 1.基本操作 1.创建JFrame窗口 JFrame ck = new JFrame(); 2.设置窗口大小 ck.setSize(8 ...

  3. mongodb java crud_MongoDB用Java,简单的CRUD操作,两种方法,附源码下载。

    两种不同的连接数据库的方式来操作. MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); 方法1: D ...

  4. java图片简单爬虫_[Java教程]使用jsoup进行简单的爬虫操作爬取图片

    [Java教程]使用jsoup进行简单的爬虫操作爬取图片 0 2015-12-01 17:00:27 package com.guanglan.util;import java.io.File;imp ...

  5. idea如何给oracle添加数据_intelij idea下使用java和JDBC连接oracle数据库及简单的SQL操作...

    intelij idea下使用java和JDBC连接oracle数据库及简单的SQL操作 发布时间:2018-07-04 10:09, 浏览次数:2532 , 标签: intelij idea jav ...

  6. github上创建java项目简单操作

    github上创建java项目简单操作 参考L: github上创建java项目简单操作 - CSDN博客 http://blog.csdn.net/qq_29392425/article/detai ...

  7. java模拟简单的银行账户,可用于存取款,查询业务操作

    ** java模拟简单的银行账户,可用于存取款,查询账户信息,银行查询当前客户数量操作 ** 本篇的内容关于:创建一个银行账户Account类,实现存款(deposit).取(withDraw)和查询 ...

  8. Java对GIF的简单删帧操作

    问题简介 最近在一些网站爬了一些搞笑动态图片,没想到保存好之后预览竟然是是这样: 用图片浏览器逐帧看了一下,原来每一张图片第一帧都是类似空白的画面,所以预览的缩略图也是第一张画面. 那么如果能用代码读 ...

  9. java递归怎么写_什么是递归?用Java写一个简单的递归程序

    什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决. 递归的要素 自定义递归函数,并确定函数的基本功能 ...

最新文章

  1. 2022-2028年中国未硫化橡胶制品行业市场运行格局及未来前景展望报告
  2. CentOS 7.7 安装cmake3
  3. android除去标题栏或全屏
  4. C#通过Outlook发送邮件
  5. 工作7年,我的10条经验总结
  6. 对MySQL性能影响关系紧密的五大配置参数
  7. PHP中的stdClass 【转】
  8. AS3.0面向对象的写法,类和实例
  9. 《大数据》2021年第5期目次摘要
  10. spring cloud微服务_面试败给微服务?别怕,我带你一起手撕Dubbo,SpringBoot与Cloud...
  11. 如何改变php的语言变中文,yii2怎么设置切换语言
  12. java堆内存_java堆内存模型
  13. astride包括那几个维度_据说宇宙有13个维度,那么各个维度都代表着什么?
  14. 字符串函数 (strfun)
  15. 函数应用SAE-Python教程(一) 在SAE上进行Python的开发
  16. Windows系统使用SSH连接远程服务器
  17. 按住滑块 拖拽验证html5,【原生】JavaScript 实现滑动拖动验证
  18. 软考系统分析师考试大纲
  19. html批量处理图片尺寸,如何批量修改图片尺寸
  20. word自动生成目录,设置从指定页码开始

热门文章

  1. 深入了解音视频开发直播协议RTMP
  2. 清洗枪市场现状研究分析与发展前景预测报告
  3. 修改el-Badge 标记 content的位置
  4. UserData使用总结
  5. js或者jQuery模拟点击提交按钮button,触发提交操作
  6. java生日贺卡,简单生日贺卡制作,涨知识了
  7. 在一台Ubuntu计算机上构建Hyperledger Fabric网络
  8. NGR-PEG-IR825 肿瘤新生血管靶向肽NGR-聚乙二醇-近红外荧光染料IR825
  9. JAVA当中的Document
  10. opencv学习笔记(2017年8月21日)之图像腐蚀操作