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
    	}
    }
    

    三、总结

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

  • 相关阅读:
    软件架构模式
    经济学基础
    使用vue-cli3新建一个项目,并写好基本配置
    vue+iview+less实现主题切换功能
    ivew table组件二次封装,解决slot-scope跨组件传递的问题
    vue-cli3使用less全局变量,不用每个组件引入less文件(亲测有效)
    vscode开发vue项目使用eslint+prettier格式化:保存时自动执行lint进行修复(升级篇,保存时可格式化模板和css)
    切换子路由时,父路由的组件会重新渲染
    更换路由时页面实现左右滑动的效果
    div设置为inline-block后,两个div之间有空隙
  • 原文地址:https://www.cnblogs.com/jebysun/p/4363806.html
Copyright © 2011-2022 走看看