小老弟 最近准备温习算法。之前垃圾的算法只是可算时要被重新提起(里面有一个错别字 是找到 我转红包哦 限一个人)哈哈
结合前辈们的讲解 我尝试发表一下拙见 欢迎大家补充
--------------------- 参考资料 ==========感谢以下作者 如有侵权 请联系我=====
原文: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 分治法 每层逻辑(调用自身即可)