递归
递归就是在方法的内部,再次调用方法本身。简单的来说就是不停的自己调用自己,如果没有结束的条件,就会形成死循环,造成内存溢出java.lang.StackOverflowError
。
public class Test {
public static void main(String[] args) {
speak();
}
static void speak() {
speak();
}
}
递归第一般来说有三步
- 明确函数要做什么
- 明确递归的结束条件(不然会造成死循环)
- 找到函数的等价关系式(缩小参数范围,进行递归调用)
例子1: 求阶乘
题目描述
求n的阶乘
1)明确函数要干什么
定义一个方法,计算n的阶乘。
int f(int n){
}
2)明确递归的结束条件
当n=1的时候,f(n) = 1
int f(int n){
if(n==1){
return 1;
}
}
当n=2时,f(n)=2,我们也可以把n=2作为结束条件
int f(int n){
if(n==2){
return 2;
}
}
所以最后递归 的结束条件要写成
int f(int n){
if(n <= 2){
return n;
}
}
3)找到函数的等价关系式(缩小参数范围,进行递归调用)
int f(int n){
if(n <= 2){
return n;
}
return n*f(n-1);
}
最后的代码
public class Test {
public static void main(String[] args) {
int result = f(6);
System.out.println(result);
}
static int f(int n) {
if(n< 2) {
return n;
}
return n*f(n-1);
}
}
例子2 斐波那契数列
题目描述
求 斐波那契数列: 1, 1, 2,3,5,8,13,21,34 … 的前 n 项是几。
1)明确函数要干什么
int f(int n){
}
2)明确结束条件
当 n = 1 或 n = 2的时候,f(1) = f(2) = 1
int f(int n){
if(n <= 2){
return n;
}
}
- 找到函数的等价关系式,f(n)=f(n-1)+f(n-2)
public class Test {
public static void main(String[] args) {
int result = f(6);
System.out.println(result);
}
static int f(int n) {
if(n<= 2) {
return 1;
}
return f(n-1)+f(n-2);
}
}
例题:
青蛙跳台阶问题