小老弟 最近准备考研! 之前垃圾的算法只是可算时要被重新提起(里面有一个错别字 是找到 我转红包哦 限一个人)哈哈
结合前辈们的讲解 我尝试发表一下拙见 欢迎大家补充
--------------------- 参考资料 ==========感谢以下作者 如有侵权 请联系我===== 原文:https://blog.csdn.net/ten_sory/article/details/64126341
https://blog.csdn.net/ikownyou/article/details/65633581
递归两个要素
1.递归边界
2.递归的逻辑——递归"公式"
递归的过程一定有参数的变化,并且参数的变化,和递归边界有关系.
在难度较大的题目中,这两者均不容易直接得到.
递归的种种问题,也许理解的同学可能可以用一句话解释清楚,但是不理解的同学再怎么说也没办法理解.
下面通过几个简单的例子【体会】一下递归,先从【感性】的角度理解递归.
先摆上例子 1.递归求和1+2+3+.....+n
public static Integer recursionSum(Integer n){ if(n>0){ return n+recursionSum(n-1); }else{ return 0; } } 2.递归阶乘n! = n * (n-1) * (n-2) * ...* 1(n>0)
public static Integer recursionMulity(Integer n){ if(n==1){ return 1; } return n*recursionMulity(n-1); } 3.河内塔问题
package arithmeticDesign; //汉罗塔的设计 import java.util.Scanner;
public class TowerOfHanoi { static int count=1;//用来记录生成步骤的条数 public static void main(String[] args) { // TODO Auto-generated method stub Scanner s=new Scanner(System.in); int n=s.nextInt(); move(n,"A","B","C"); } /** * 将n个盘子从A移到B,C作为辅助的柱子 * @param n 原来有多少个盘 * @param A 原来放置盘子的柱子 * @param B B柱子 * @param C C柱子 */ public static void move(int n,String A,String B,String C) { if(n==1){ System.out.println("第"+count+++"步:"+"将第1个盘从"+A+"移到"+B); } else{ move(n-1,A,C,B); System.out.println("第"+count+++"步:"+"将第"+n+"个盘从"+A+"移到"+B); move(n-1,C,B,A); } }; } !
4.判定一系列字符串中是否有相同的内容
public static boolean fun(int n,String[] a){ boolean b = false; if(n == a.length){ b = true; }else{ for(int i = n; i < a.length-1; i++){ System.out.println(n+" "+(i+1)); if(a[n].equals(a[i+1])){ return false; } } n++; fun(n,a); } return b; }
//总结 关键两个!!!!1 找到能够让递归函数返回的条件 2 分治法 每层逻辑(调用自身即可)
