递归算法

2019-03-25  本文已影响0人  小丘啦啦啦

一、说明
递归算法就是直接或者间接调用自身的算法,递归函数也如此。
递归的数学模型起始就是归纳法。解决一个问题,转化为解决它们的子问题,而子问题又转化为子问题,然后会发现这些问题都是同一个模型,即存在相同的逻辑归纳处理项。例外即是递归结束的处理,不再适用我们的归纳处理项,否则就无穷递归了。

void func(val){
  if(end){   //判断归纳终点,结束条件
    val = constExpression;   //直接求解表达式,即在结束条件下能够直接计算返回值的表达式
    return val;    //递归结束处理(return结果等)
  } else {   //不符合结束,进行递归处理
    accumrateExpreesion;   //逻辑归纳项
     //适用于一切非适用于结束条件的子问题的处理,当然步进表达式其实就是包含在这里面了。
    val = expression;   //步进表达式,问题蜕变成子问题的表达式
    func(val) ;   //调用本身进行递归
  }
} 

递归实际体现了“以此类推”、“用同样的步骤重复”这样的思想。
还有数据结构如二叉树,结构本身固有递归特性。
二、递归实例
1、最经典的就是n!,即n的阶层算法。
n! = n * (n-1) * (n-2) * ...* 1(n>0)

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int num  = input.nextInt();
        int result = countRank(num);
        System.out.println(num+"阶层计算结果:"+result);
        input.close();
    }
    /**
     * n阶层计算的递归方法
     */
    public static int countRank(int num){
        if(num==1){
            return num;
        }else{
            int Num = num*countRank(num-1);
            return Num;
        }
    }
}

2、二叉树。类似于:查找当前租户的所有下级租户(当前租户有下一级的租户,然后每个下级租户又可能有再下级租户。。。以此类推下去)。

public List<String> listChildRentByRent(String rent){   //rent,租户号
    List<String> list = listChildRent(rent);   //listChildRent,查找租户的所有下级租户list
    if(list.size()==0){
        return list;
    }else{
        for(int a=0;a<list.size();a++){
            list.addAll(listChildRentByRent(list.get(a)));
        }
        return list;
    }       
}
上一篇 下一篇

猜你喜欢

热点阅读