非零基础自学Java (老师:韩顺平)
✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】
第7章 面向对象编程(基础部分)
文章目录
- 非零基础自学Java (老师:韩顺平)
- 第7章 面向对象编程(基础部分)
- 7.4 方法递归调用
- 7.4.1 基本介绍
- 7.4.2 递归能解决什么问题
- 7.4.3 递归举例
- 7.4.4 递归重要规则
- 7.4.5 课堂作业
7.4 方法递归调用
7.4.1 基本介绍
递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变
得简洁
7.4.2 递归能解决什么问题
- 各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)
- 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等。
- 将用栈解决的问题–>递归代码比较简洁
7.4.3 递归举例
【打印问题】
/**
* ClassName: T
* date: 2022/9/2 16:23
*
* @author DingJiaxiong
*/
class T {
public void test(int n){
if (n > 2){
test(n - 1);
}
System.out.println("n = " + n);
}
}
/**
* ClassName: Recursion01
* date: 2022/9/2 16:22
*
* @author DingJiaxiong
*/
public class Recursion01 {
public static void main(String[] args) {
T t1 = new T();
t1.test(4);
}
}
运行结果
这很好理解
初始进入方法 n =4 ,n > 2成立,立马执行test(3)
n = 3,n > 2成立,立马执行 test(2),
n = 2,n > 2不成立,输出2
输出3
输出4
【阶乘问题】
public int factorial(int n){
if (n == 1){
return 1;
}
else{
return factorial(n - 1) * n;
}
}
调用结果
调用过程
韩老师的图解:
7.4.4 递归重要规则
- 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响,比如n变量
- 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据.
- 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError)
- 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
7.4.5 课堂作业
- 请使用递归的方式求出斐波那契数1,1,2.3.5,8,13.….给你一个整数n,求出它的值是多少
- 猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃),发现只有1个桃子了。问题:最初共多少个桃子?
经典斐波那契:
public int fibonacci(int n){
if (n >= 1){
if (n == 1 || n == 2){
return 1;
}
else{
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
else{
System.out.println("要求输入的n >= 1的整数");
return -1;
}
}
调用
/**
* ClassName: RecursionExercise01
* date: 2022/9/2 16:35
*
* @author DingJiaxiong
*/
public class RecursionExercise01 {
public static void main(String[] args) {
T t1 = new T();
int n = 7;
System.out.println("n=" + n + "时,对应的斐波那契数 = " + t1.fibonacci(n));
}
}
运行结果
桃子问题:
/**
* ClassName: T
* date: 2022/9/2 16:23
*
* @author DingJiaxiong
*/
class T {
public void test(int n) {
if (n > 2) {
test(n - 1);
}
System.out.println("n = " + n);
}
public int factorial(int n) {
if (n == 1) {
return 1;
} else {
return factorial(n - 1) * n;
}
}
public int fibonacci(int n) {
if (n >= 1) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
} else {
System.out.println("要求输入的n >= 1的整数");
return -1;
}
}
public int peach(int day) {
if (day == 10) {
return 1;
} else if (day >= 1 && day <= 9) {
return ((peach(day + 1) + 1) * 2);
} else {
System.out.println("day应该是1-10");
return -1;
}
}
}
调用类
/**
* ClassName: RecursionExercise01
* date: 2022/9/2 16:35
*
* @author DingJiaxiong
*/
public class RecursionExercise01 {
public static void main(String[] args) {
T t1 = new T();
int n = 7;
// System.out\.println("n=" + n + "时,对应的斐波那契数 = " + t1.fibonacci(n));
int day = 9;
int peachNum = t1.peach(day);
if (peachNum != -1){
System.out.println("第" + day + "天有" + peachNum + "个桃子");
}
}
}
运行结果
更多推荐
非零基础自学Java (老师:韩顺平) 第7章 面向对象编程(基础部分) 7.4 方法递归调用
发布评论