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