java中的递归算法

标签: 递归算法 java
15人阅读 评论(1) 收藏 举报
分类:

递归算法的条件有两个:

1.趋近于某一终止条件

2.循环调用自己本身

比如斐波那契数列的算法,fn=f(n-1)+f(n-2);

public class Dgui {
     public static int fbnq(int n){
         int f1=1;
         int f2=1;
         int f3=2;
         for(int i=2;i<n;i++){
             f3=f1+f2;
             f1=f2;
             f2=f3;
         }
         return f3;//斐波那契数列的算法,返回当前的斐波那契数
     }
     public static int fbnq1(int n){
         if(n==1||n==2){
/*当n为1或者2时,只有f1=f2=1,则此时返回1
         不可以直接写为if(n==3){
                         return 2;
                         }
    因为后面算法在调用自身时会用到f1,f2,这样一些运行会报错

*/           
             return 1;
         }
         return fbnq1(n-1)+fbnq1(n-2);//f3=f1+f2,f4=f2+f3,f5=f3+f4……
     }
    public static void main(String[] args) {
           int a=6;//表示要求第几个斐波那契数字
           fbnq(a);
           fbnq1(a);
           System.out.println("普通方法结果: "+fbnq(a));//调用斐波那契数列的普通算法以作验证
           System.out.println("递归方法结果:"+fbnq1(a));

    }

}

运行结果:
这里写图片描述

汉诺塔问题:

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

此问题满足递归算法的条件,可以用递归算法来算,假设三个柱子分别时A,B,C,我们知道,当只有一个圆盘时,只需将圆盘从第一个柱子移到第三个柱子即可,只需要移动一次,而当有两个圆盘时,我们需要三次,先将A上那个小的从A移到B,再将A上那个大的从A移到C,然后将已经移到B上那个小的从B移到C,共三步

这里写图片描述

所以当有n个盘子时,可以将n个盘子理解为只有第n个和剩下的n-1个两部分(即把n-1看做一部分,把单个n看做一部分),那么,也需要三步,先将A上那个小的(n-1)从A移到B,再将A上那个大(n)的从A移到C,然后将已经移到B上那个小的(n-1)从B移到C,也是三步,
这里写图片描述
实现其过程的代码为:

package study;
//汉诺塔
public class HanNuoTa {
     public static void han(char pos1,char pos3){

         System.out.println(pos1+"--->"+pos3);
     }
     public static void nuo(int n,char pos1,char pos2,char pos3){

         if(n==1){
             han(pos1,pos3);
         }
         else{
             nuo(n-1,pos1,pos3,pos2);/*把n个盘子看做两个整体部分,把n-1个盘看作一个整体,从塔1移到塔2;
             把最大的那个盘n盘看作一个整体,从塔1移到塔3;
             */
             han(pos1,pos3);
             nuo(n-1,pos2,pos1,pos3);//把n-1看做一个整体从塔2移到塔3;
         }
     }
public static void main(String[] args) {
          nuo(3,'A','B','C');
    }

}

运行结果:
这里写图片描述
汉诺塔这个操作的时间复杂度为2^n-1,所以如果要算A上放64个盘子所需时间非常长,计算机也要二百多年才能算出来的。

查看评论

递归算法 Java实现

缘起于网易的一道算法笔试题,之前对递归算法有一个初步印象。感觉递归好像就是一种迭代的过程。将原问题不断分解为若干个与原问题类似更小的问题,直到小问题已知,也就是找到了递归算法的出口,此时,再讲问题回带...
  • freesunshining
  • freesunshining
  • 2016-03-25 13:36:33
  • 838

Java递归算法应用

递归: 就是函数自身调用自身。 什么时候用递归呢? 当一个功能被重复使用,而每一次使用该功能时的参数不确定,都由上次的功能元素结果来确定。 简单说: 功能内部又用到该功能,但是传递的...
  • u010785585
  • u010785585
  • 2016-10-19 08:55:37
  • 3260

java递归算法总结

1.何为递归 个人理解就是自己调用自己,直到满足一个条件结束自己调用自己的过程,这个就是递归。举一个通俗的点的例子: 假设你在一个电影院,你想知道自己坐在哪一排,但是前面人很多,你懒得去数了,于是你问...
  • tomcat_2014
  • tomcat_2014
  • 2016-04-10 17:30:43
  • 10625

java中递归算法的理解

Coding多了,递归算法是非常常见的,最近我一直在做树形结构的封装,所以更加的离不开递归算法。所以今天就简单说一下这个递归算法,用java实现一个非常经典的递归实例。          ...
  • qfikh
  • qfikh
  • 2016-05-20 17:00:46
  • 2636

Java递归算法构造JSON树形结构

  • 2017年10月20日 16:56
  • 22KB
  • 下载

java递归算法的简单示例

java递归算法的简单示例 今天参加笔试,要求用递归实现1+3+5+7...... 没写出来,蛋疼。。。。下面复习一下,自己尝试着写还是没有写出来。。。。。 没有写出来的关键是自己不知道该如何实...
  • u013793732
  • u013793732
  • 2016-03-11 18:05:20
  • 3320

15个典型的递归算法的JAVA实现

  • 2014年04月02日 18:06
  • 39KB
  • 下载

在Java中使用递归算法删除一个带内容的目录。

import java.io.File; /*  * 删除一个带内容的目录。  * 删除原理:  * 在window中,删除目录从里面往外删除。  * 方法:使用递归  */ p...
  • zhyzh134
  • zhyzh134
  • 2016-03-13 19:38:46
  • 250

java数据结构与算法之递归思维(让我们更通俗地理解递归)

汉诺塔的问题 数学归纳法的思维 递归算法的思考方式 斐波那契数列中的递归思想 再谈递归图形...
  • javazejian
  • javazejian
  • 2016-12-12 11:50:26
  • 12190

java递归算法示例,单参数,多参数

这两天公司来了个新同事,顺便带一下,给他解释下递归算法。 要点:找出口,出口即调用自己直到不能调用为止,不能调用即自身方法已经return到具体值。 例: package test; publi...
  • u011530389
  • u011530389
  • 2015-12-16 15:09:03
  • 474
    个人资料
    等级:
    访问量: 112
    积分: 75
    排名: 161万+
    文章分类
    文章存档
    最新评论