递归:recursion
简单的说:
递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题,同时可以让代码变得简洁
递归法思考
- 汉诺塔放置
如何把A框的方格完全移动到C框(条件:下方格子必须必上方格子长)
- 走迷宫
- 八皇后
递归入门源码分析
public class Recursion01{
public static void main(String[] args){
T t1 = new T();
t1.test(4);
}
}
class T {
public void test(int n){
if (n > 2){
test(n - 1); //递归调用
}
System.out.println("n = " + n);
}
}
/*这个代码最后输出什么?
n = 2?
NO!
n = 4
n = 3
n = 2
没错,先输出顶层的栈,顶层栈为n = 2;
递归会不断地占用内存空间,容易栈溢出
每个栈是独立空间,每个n也是独立的
栈执行后会释放内存
练习代码分析
```java
public class Recursion01{
public static void main(String[] args){
T t1 = new T();
t1.test(4);
}
}
class T {
public void test(int n){
if (n > 2){
test(n - 1); //递归调用
}else{
System.out.println("n = " + n);
}
}
}
//输出 n = 2
练习代码分析(阶乘递归调用)
public class Recursion01{
public static void main(String[] args){
T1 t1 = new T1();
System.out.println(t1.factorial(5));
}
}
class T1{
public int factorial(int n){
if(n == 1){
return 1;
}else{
return factorial(n - 1) * n;
}
}
}
//输出120
方法递归注意
- 递归必须向退出递归的条件逼近,否则就是无限递归,出现StrackOverflowError,死龟了:)
- (栈溢出)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕
- 执行方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响,比如n变量
- 如果方法中使用的引用类型变量(比如数组,对象),就会共享该引用类型的数据。
递归练习(斐波那契数列)
package practice;
import java.util.Scanner;
public class practice1{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Add t1 = new Add();
System.out.println("当前位置的斐波那契数列为"+t1.fibonacci(n)); //返回第8位的斐波那契数列,值为21
}
}
class Add{
public int fibonacci(int n){ //n是位数
if (n == 1 || n == 2){
return 1; //返回的是数值,不是位数
} else {
return fibonacci(n - 1) + fibonacci(n - 2); //返回的数值
}
}
}