递归
- 递归概述: 方法定义中调用方法本身的现象
- 递归注意事项
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
package org.westos.demo;
public class MyTest {
public static void main(String[] args) {
// 递归 : 在Java中指的是, 在方法中调用方法本身 的这种现象
//1,递归要注意两个事项: 递归要有出口, 递归的次数不宜过多
// 以上两点,有可能会造成栈溢出
//2. 死递归,没有出口,造成栈溢出
//生活中的递归:从前有座庙庙里有个老和尚---------
//程序员---学java---挣钱----娶媳妇---生娃----学Java-----挣钱----娶媳妇
show(10);
}
private static void show(int n) {
System.out.println("死递归");
show(10); // 这行命令 是死递归 :没有出口 // 这行命令 会报错 :StackOverflowError 栈内存 溢出
/* if(n>0){
show(n - 1);
}else{ // 等 n=0 n<0 的时候就不再调用自己了
return;
} //这段注释的代码 是有出口的递归 不是死递归
*/
}
}
递归解决问题的思想及图解
- 画图演示:递归解决问题的思想及图解(5!)
递归所体现的思想:体现的是一种拆分和合并的思想
递归求阶乘的代码实现及内存图解
- 案例演示
需求:求5的阶乘
循环实现
递归实现
// 循环实现
package org.westos.demo;
public class MyTest {
public static void main(String[] args) {
//5的阶层 5*4*3*2*1
// int r=5*4*3*2*1;
int r=1;
for (int i = 1; i <= 5; i++) {
r*=i;
}
System.out.println(r);
}
}
// 递归实现
package org.westos.demo;
public class MyTest {
public static void main(String[] args) {
//用递归的思想来处理5的阶乘
int r = factorial(5);
System.out.println("结果" + r);
}
private static int factorial(int n) {
if (n == 1) { // 写递归 可以先写 if(){}else{}语句 找出口
return 1;
} else {
return n * factorial(n - 1);
}
}
}
- 画图演示: 递归实现求5的阶乘的内存图
不死神兔问题
- 案例演示: 需求:兔子问题(斐波那契数列)
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
由此可见兔子对象的数据是:1 , 1 , 2 , 3 , 5 , 8 …
// 循环实现
package org.westos.demo;
public class MyTest {
public static void main(String[] args) {
/* 月份 对数
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
这组数据 斐波那契数列: 1 1 2 3 5 8 13 21 从第三个数开始,后面的每个数 等于他前两个数之和
*/
//定义一个数组,数组的长度20 // arr[19] 就是 第二十个月的的兔子对数
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
System.out.println(arr[19]);
}
}
// 递归实现
package org.westos.demo;
public class MyTest {
public static void main(String[] args) {
// 这组数据 斐波那契数列:1 1 2 3 5 8 13 21 从第三个数开始,后面的每个数 等于他前两个数之和
int sum = rabbit(20);
System.out.println(sum);
}
private static int rabbit(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return rabbit(n - 1) + rabbit(n - 2);
}
}
}