1.递归算法:
1)什么是递归:
方法调用方法本身的一种现象! 而不是方法嵌套方法
2)核心代码:
public int get(int n){
System.out.println(n) ;
if(n!=0){
get(n--) ;
}
}
3)递归思想:
1)必须定义一个方法(函数)
2)有一定的规律
3)必须有出口条件(结束条件) ,如果没有结束条件就是死递归!
4)案例:
* 需求:
* 求5的阶乘!
*
* 分析:
* 1)普通for循环---求阶乘思想
* 2)方法递归解决这个问题
*
* a)必须有一个方法
* b)有规律
* c)有结束条件(出口条件)
*
* 求5的阶乘
* 拆分法:将一个大的问题:拆分成 若干个小问题
public class DiGuiTest {
public static void main(String[] args) {
//定义最终结果变量
int jc = 1 ;
for(int x = 1 ;x <= 5; x ++){
jc*=x ;
}
System.out.println("5的阶乘是:"+jc);
System.out.println("--------------------------------------") ;
System.out.println("5的阶乘是:"+getResult(5)) ;
}
//定义方法
private static int getResult(int n) {//5
//判断n的值
if(n==1){
return 1 ; //出口条件(结束条件)
}else{
return n*getResult(n-1) ;//5*getResult(4) ;
}
}
}
* 需求:
* 有一对兔子,从出生后第三个月起每个月产生一对兔子,小兔子长到第三个月后每个月又产生一对兔子;如果兔子都不死,
* 第二十个月兔子的对数是多少? (不死神兔)
* * 已知就是前两个月的兔子的对数都是1;
* * 规律:
* * 第一个月:1
* * 第二个月:1
* * 第三个月:2
* * 第四个月:3
* * 第五个月:5
* * 第六个月:8
* * 第七个月:13
* *
* * ...
* * ...
* *
* * 几种方式:
* * 1)数组方式解决
* * 2)递归:定义方法/找规律/找出口条件
*
* 规律:
* 已知第一个月和第二个月的兔子对数都是1
* 从三个月开始,每个月兔子对数是前两个月之和
*
*
* 递归方式
* 1)定义方法(第二十个月 :20) ---参数为n
* 2)如果n==1或者n==2 return 1 ; 如果n是第一个月或者n是第二个月,兔子对数1
* 3)如果不是第一个月或者第二个月: 从三个月开始,每个月兔子对数是前两个月之和
*
*
* 应用场景:
* 使用递归思想解决实际问题:
*
* 需要不断的删除带内容的目录 :递归删除带内容的目录---如何表示文件? IO流File
* demo目录
* 子目录
* 子子目录
* xx.java
* xx.java
*
*/
public class DiGuiTest2 {
public static void main(String[] args) {
//数组方式
//已知前两个的兔子对数都是1
//创建一个数组,长度20
int[] arr = new int[20] ;
arr[0] = 1 ;
arr[1] = 1 ;
//第三个月,从三个月开始,每个月兔子对数是前两个月之和
for(int x = 2; x <arr.length; x++){
arr[x] = arr[x-1] + arr[x-2] ;
}
System.out.println("第二十个月的兔子对数是:"+arr[19]);//6765
System.out.println("----------------------------------------") ;
System.out.println("第二十个月的兔子对数是:"+getRabbit(20)) ;
}
//定义一个方法
public static int getRabbit(int n){//第n个月
//出口条件
//n==1或者n==2: 兔子的对数1
if(n==1|| n==2){
return 1 ;
}else{
return getRabbit(n-1) + getRabbit(n-2) ;
}
}
}