递归算法
① 程序调用自身的编程技巧称为递归。
② 一个方法在其定义或说明中又直接或间接的调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需的多次重复计算,大大地减少了程序的代码量。
递归算法注意
① 递归就是在方法里调用自身。
② 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
示例:使用递归算法求5!(阶乘)
分析:5!=5*4!,4!=4*3!,3!=3*2!,2!=2*1!,1!=1
再将最后的值从后往前返回到它的上一个,返回1!,2!,3!,4! 最后是5!。
1 class FacUtil{
2 public static int getFac(int number){
3 if(number==1){
4 return 1;
5 }else{
6 return number*getFac(number-1);
7 }
8 }
9 }
主方法调用
1 System.out.println(FacUtil.getFac(5)); 对递归算法的理解
1.递归的定义:程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
2.递归的优点:代码简洁,结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性;
3.递归的缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
4.递归的实例: 1).计算 n! ;
2.递归的优点:代码简洁,结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性;
3.递归的缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
4.递归的实例: 1).计算 n! ;
1 public class Demo {
2 public static void main(String[] args) {
3 System.out.println(recursion(10));
4 }
5 public static int recursion(int i){
6 int sum = 0;
7 if(i == 1){
8 return 1;
9 }else{
10 sum = i * recursion(i-1);
11 }
12 return sum;
13 }
14 }
今天无聊写一下递归算法,好久没用也忘了,刚好记下来,下次直接look。
一、数字例子
下面是一个计算5的阶乘(result = 5*4*3*2*1=120)
今天无聊写一下递归算法,好久没用也忘了,刚好记下来,下次直接look。 一、数字例子 下面是一个计算5的阶乘(result = 5*4*3*2*1=120) public class Test01 { /** * @param args */ public static void main(String[] args) { System.out.println(f(5)); } public static int f(int n) { if (1 == n) return 1; else return n * f(n-1); } } 按照递归的三个条件来分析: (1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底; (2)递归前进段:当前的参数不等于1的时候,继续调用自身; (3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*4,即5*(5-1),即n*(n-1),一直往回乘5*4*3*2*1。 二、字符串递归例子 //获取用户组(包括父组的字符串) //获取字符串组装放到sql: in(codes)条件里面 private String getCode(String code){ if(StringUtils.isBlank(code)){ return code; }else{ Group group = dao().fetch(Group.class, code); if(group != null && StringUtils.isNotBlank(group.getParentCode()) && !"0".equals(group.getParentCode())){ String tmp = "'"+code+"',"+getCode(group.getParentCode()); return tmp; } return "'"+code+"'"; } } public static void main(String[] args){ System.out.println(getCode("qiantai")); } 比如有前台用户组qiantai,其父组为行政xingz, 行政的用户组xingz,其父组为子公司subcom, 查询流程:qiantai--》xingz--》subcom。 返回刚好往回走:先返回'subcom',接着,返回'xingz','subcom',最后返回'qiantai','xingz','subcom' 。 流程也跟数字例子一样,先一层一层往下走,最后最下层往上一层一层返回。 下面是递归概念说明: 解释:程序调用自身的编程技巧叫做递归。 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。 递归的三个条件: 边界条件 递归前进段 递归返回段 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
按照递归的三个条件来分析:
(1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底;
(2)递归前进段:当前的参数不等于1的时候,继续调用自身;
(3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*4,即5*(5-1),即n*(n-1),一直往回乘5*4*3*2*1。
二、字符串递归例子
//获取用户组(包括父组的字符串)
//获取字符串组装放到sql: in(codes)条件里面
//获取用户组(包括父组的字符串) //获取字符串组装放到sql: in(codes)条件里面 private String getCode(String code){ if(StringUtils.isBlank(code)){ return code; }else{ Group group = dao().fetch(Group.class, code); if(group != null && StringUtils.isNotBlank(group.getParentCode()) && !"0".equals(group.getParentCode())){ String tmp = "'"+code+"',"+getCode(group.getParentCode()); return tmp; } return "'"+code+"'"; } } public static void main(String[] args){ System.out.println(getCode("qiantai")); }
比如有前台用户组qiantai,其父组为行政xingz,
行政的用户组xingz,其父组为子公司subcom,
查询流程:qiantai--》xingz--》subcom。
返回刚好往回走:先返回'subcom',接着,返回'xingz','subcom',最后返回'qiantai','xingz','subcom' 。
流程也跟数字例子一样,先一层一层往下走,最后最下层往上一层一层返回。
下面是递归概念说明:
解释:程序调用自身的编程技巧叫做递归。
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归的三个条件:
边界条件
递归前进段
递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。