一、递归算法设计的基本思想是:

对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。

在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。

关键要抓住的是:
(1)递归出口

(2)地推逐步向出口逼近

二、递归算法实例

(1)阶乘:

要求:给定一个数值,计算出它的阶乘值,例如5的阶乘为5*4*3*2*1

实现:

  1. <span style="font-size:12px;">  // 利用递归实现一个数的阶乘值
  2. private static BigDecimal getNum(BigDecimal inNum) {
  3. if (inNum.compareTo(BigDecimal.ONE) == 0) {
  4. return inNum;
  5. }
  6. return inNum.multiply(getNum(inNum.subtract(BigDecimal.ONE)));
  7. }</span>

(2)Fibonacci数列:1,1,2,3,5,8,13……

要求:找出数列中指定index位置的数值

实现:

  1. <span style="font-size:12px;">  // 利用递归实现了Fibonacci数列
  2. private static int fab(int index) {
  3. if (index == 1 || index == 2) {
  4. return 1;
  5. } else {
  6. return fab(index - 1) + fab(index - 2);
  7. }
  8. }</span>

(3)汉诺塔

要求:汉诺塔挪动

实现:

  1. <span style="font-size:12px;">  <span style="white-space:pre">  </span>private static final String DISK_B = "diskB";
  2. <span style="white-space:pre">    </span>private static final String DISK_C = "diskC";
  3. <span style="white-space:pre">    </span>private static final String DISK_A = "diskA";
  4. <span style="white-space:pre">    </span>static String from=DISK_A;
  5. <span style="white-space:pre">  </span>  static String to=DISK_C;
  6. <span style="white-space:pre">  </span>  static String mid=DISK_B;
  7. <span style="white-space:pre">  </span>  public static void main(String[] args) {
  8. <span style="white-space:pre">  </span>      String input=JOptionPane.showInputDialog("please input the number of the disks you want me move.");
  9. <span style="white-space:pre">  </span>      int num=Integer.parseInt(input);
  10. <span style="white-space:pre">  </span>      move(num,from,mid,to);
  11. <span style="white-space:pre">  </span>  }</span>
  1. <span style="font-size:12px;">  // 利用递归实现汉诺塔
  2. private static void move(int num, String from2, String mid2, String to2) {
  3. if (num == 1) {
  4. System.out.println("move disk 1 from " + from2 + " to " + to2);
  5. } else {
  6. move(num - 1, from2, to2, mid2);
  7. System.out.println("move disk " + num + " from " + from2 + " to " + to2);
  8. move(num - 1, mid2, from2, to2);
  9. }
  10. }</span>

(4)排列组合

要求:将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc",

则程序会输出

abc
                      acb
                      bac
                      bca
                      cab
                      cba

实现:

  1. <span style="font-size:12px;"><span style="white-space:pre">    </span>public static void permute(String str) {
  2. <span style="white-space:pre"> </span>   char[] strArray = str.toCharArray();
  3. <span style="white-space:pre">    </span> permute(strArray, 0, strArray.length - 1);
  4. <span style="white-space:pre">  </span>}</span>
  1. <span style="font-size:12px;">  // 利用递归实现,将输入的一个字符串中的所有元素进行排序并输出
  2. public static void permute(char[] list, int low, int high) {
  3. int i;
  4. if (low == high) {
  5. String cout = "";
  6. for (i = 0; i <= high; i++) {
  7. cout += list[i];
  8. }
  9. System.out.println(cout);
  10. } else {
  11. for (i = low; i <= high; i++) {
  12. char temp = list[low];
  13. list[low] = list[i];
  14. list[i] = temp;
  15. permute(list, low + 1, high);
  16. temp = list[low];
  17. list[low] = list[i];
  18. list[i] = temp;
  19. }
  20. }
  21. }</span>

总结递归算法来说,这个根就是那个出口,只要找到这个出口所在,那么算法自然而然就能水到渠成了。

参考资料一:http://blog.csdn.net/lfsf802/article/details/7696405

参考资料二、http://nevergives.blog.sohu.com/95934843.html

转: JAVA递归算法实例小结的更多相关文章

  1. JAVA RMI 实例

    下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...

  2. Java多线程-实例解析

    Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...

  3. Thrift入门初探--thrift安装及java入门实例

    什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...

  4. java并发包小结(二)

    接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...

  5. [Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  6. 【thrift】thrift入门初探--thrift安装及java入门实例

    转载:https://www.cnblogs.com/fingerboy/p/6424248.html 公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门 ...

  7. Redis缓存Mysql模拟用户登录Java实现实例[www]

    Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...

  8. java IO 流小结

    java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.

  9. Flex Socket与Java通信实例说明(转)

    Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...

随机推荐

  1. 【前端】Web前端学习笔记【2】

    [2016.02.22至今]的学习笔记. 相关博客: Web前端学习笔记[1] 1. this在 JavaScript 中主要有以下五种使用场景 在全局函数调用中,this 绑定全局对象,浏览器环境全 ...

  2. android shortcut &livefoulder

    android shortcut(实现步骤) 1.建立activity 2.minifest 里面注册并加上intent-filter,name为:android.intent.action.CREA ...

  3. Unity手撸2048小游戏——背景文字控制

    今天继续昨天的计划吧 1.新建项目.场景命名啥的都不说了吧. 2.直接开始新建一个Image,顺便把Image改名成Chessman 3.选中Image新建一个Text对象,调整下大小位置.这样就算完 ...

  4. Learning by doing

    Learning by doing 绪论:读了娄老师的公众号中--<做中学(Learning By Doing)>这篇文章后,深有感触,我想到很多自己之前的事情,很多都是每每想的很好,总是 ...

  5. UVA 11384 正序数排列

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. Cheatsheet: 2016 08.01 ~ 08.31

    .NET Getting Started with ASP.NET Core and VS Code Coding Standard Best Practices In C# Wire – Writi ...

  7. Exception in thread "main" java.lang.ExceptionInInitializerError

    Exception in thread "main" java.lang.ExceptionInInitializerErrorCaused by: java.util.Missi ...

  8. JS事件模型小结

    三种事件模型:原始事件模型(DOM0),DOM2事件模型,IE事件模型: 不同点: 事件程序的注册(给HTML元素所对应的JS对象绑定事件) 事件传播的过程 事件模型的注册: 一.原始事件模型(没有兼 ...

  9. java基本数据类型的字面量

    java的基本数据类型一共有8种.其中:(每种类型后面列出了java中的该类型的字面量) 四种整型: int  4字节: 12  +12  -12  077 0xFF  0b101(JDK7中支持的二 ...

  10. 浅析word-break work-wrap区别

    word-break:[断词] 定义:规定自动换行的处理方法.   注:通过word-break使用,可以实现让浏览器在任意位置换行. 语法:word-break: normal|break-all| ...