zoukankan      html  css  js  c++  java
  • 浅析递归

    一、递归的概念

      众所周知,在一个方法里可以调用一个或者多个方法。那么,一个方法是否可以调用其自身呢?没错,方法调用其自身的过程就是递归。

    二、递归应用案例

      1.阶乘

      最简单的一个递归的应用是计算一个数的阶乘。阶乘的公式:

      n!=n*(n-1)*(n-2)*...1. 例如:5!=5*4*3*2*1.

      代码如下:

    public static long jieCheng(int n) {
    	if(n>1)
    		return n*jieCheng(--n);
    	else 
    		return 1;
    } 
    

      2.斐波那契数列

      斐波那契数列的排列队形如:1,1,2,3,5,8,13,21,34.... 即:f(1)=1,f(2)=1,当n>2时,f(n)=f(n-1)+f(n-2)。

      代码如下:

    public long fibRecursion(int index) {
    	if(index==1 || index==2) {
    		return 1;
    	}
    	return fibRecursion(index-2)+fibRecursion(index-1);
    }
    

      3.汉诺塔

      假设有3个分别命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同、从上到下,从小到大编号为1,2,3...n个圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排。圆盘移动时必须遵守下列规则:

      a.每次只能移动一个圆盘; 

      b.圆盘可以插在X,Y和Z中的任一塔座上;

      c.任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 

      分析:

      设F[n]表示将n个盘从按规则从X柱移到Z柱的步骤,显然,当n=1时,F[n]=1;当n>1时,我们将移动盘之的过程分为三步:

      (1)将X柱上的n-1个盘依靠Z柱移到Y柱上,这个需要F[n-1]步;

      (2)将X柱上剩下的一个盘(最大的盘)移到Z柱上,这个需要1步;

      (3)将Y柱上的n-1个盘依靠X柱移到Z柱上,这个需要F[n-1]步。

      代码如下:

    public void hanoi(int level,String a,String b,String c) {
    	if(level==1) {
    		System.out.println("MOVE "+a+" TO "+c);
    	} else {
    		hanoi(level-1,a,c,b);    //第一步,调用自身将n-1个盘子从A移到B
    		System.out.println("MOVE "+a+" TO "+c);        //第二步,将第n个(最下面最大的一个)盘子从A移到C
    		hanoi(level-1,b,a,c);    //第三步,调用自身将n-1个盘子从B移动到C
    	}
    }
    

    三、总结

      递归的表现是多种多样的,可以只调用一次方法自身(例如:阶乘),也可以多次调用方法自身(例如:汉诺塔),还可以在方法内一个表达式中多次调用自身(例如:斐波那契数列)。

  • 相关阅读:
    01-文件系统
    适配器模式,新老系统兼容
    01-Entity FrameWork如何控制数据的变化
    .Net实战之反射操作篇
    .Net实战之反射相关类之间的人体经络关系
    .Net实战之反射外卖计费
    [转]UINavigationController 返回的方法汇总
    [转]AFNetWorking使用笔记
    vue----子组件引用vux popup mask遮罩在最上层解决办法 z-index问题
    vue系列---vue项目(已安装vuex)中引入jquery
  • 原文地址:https://www.cnblogs.com/jebysun/p/4363806.html
Copyright © 2011-2022 走看看