什么是递归算法
程序直接或间接的调用自身方式称为递归算法。将一个大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解。
递归通用模板:
递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。需要注意,递归必须要有一个明确的递归结束条件,否则会一直执行下去,造成死锁。
public void 递归(参数0){ if(终止条件){ return 0; } 递归(参数1); //调用方法}//如果写成如下形式,则会发生堆栈溢出 public void 递归(参数0){ 递归(参数1); //调用方法 if(终止条件){ return 0; }}
案例介绍
1.斐波那契数列 :这是一道非常经典的递归题,每一项等于前两项之和。
public int fibonaci(int n){ if(n==1 || n==2){ return 1; //当n=1,=2时,返回值为1。 } return fibonaci(n-1)+fibonaci(n-2);}// 1 1 2 3 5 8 13 21....
2.汉诺塔
问题描述:三个柱子A,B,C 。将A上的所有圆盘不修改从小到大的顺序,经过B移动到C盘即可。
如果没看懂的话,给大家推荐个4399小游戏,讲的也就是汉诺塔实现过程。
http://www.4399.com/flash/109504_1.htm
这里定义一个方法:public void hanio(int n,char a, char b, char c):代表有n个圆盘,A圆盘借助B移动到C;
如果只有一个圆盘,便直接从A移动到C;
如果有多个圆盘,则需要借助圆盘B进行过度,A➡C➡B , 然后在经过第二轮将B➡A➡C;来按照顺序完成转换。
public void hanio(int n,char a, char b, char c){ if(n == 1){ move(n,a,c); }else{ //三步曲,注意观察,a,b,c三个的位置变化 //1.把 n-1 个盘子看成一个整体,借助 C 从 A 移动到 B hanio(n-1,a,c,b); //2.把第 n 个盘子从 A 移动到 C move(n,a,c); //3.再把 n-1 盘子整体,借助 A 从 B 移动到 C hanio(n-1,b,a,c); } } public static void move(int n , char a, char b){ System.out.println("把第"+ n +"个盘子从"+ a +"移到"+ b); }
欢迎大家关注公众号【江胖子学编程】 现后台回复Java,可得大佬的Java后端开源学习笔记一份,涉及到JVM、算法、kafka、微服务等,小江也在读,特此推荐。



