递归思想
-
什么是递归?
一个方法出现了自己调用自己,就是递归。
自己调用自己,可以是直接调用,也可以间接调用。void a(){ a();//直接调用自己 } void a(){ b();//间接调用自己 } void b(){ a(); }
-
递归要注意?
- 如果不加任何条件的无限递归,那么会报错。
StackOverflowError:栈内存溢出错误。 - 正确的递归,一定是限制条件,即有出口。
- 用递归前要先找到对应的数学规律。
- 递归实例
/*
计算斐波那契数列(Fibonacci)的第n个值
数列:
1 1 2 3 5 8 13 21 34 55 ......
规律:从第三个数开始,一个数等于前两个数之和,
f(0) =1,
f(1) = 1,
f(2) = f(0) + f(1) =2,
f(3) = f(1) + f(2) = 3,
f(4) = f(2) + f(3) = 5
...
f(n) = f(n-2) + f(n-1);
*/
class Recursion{
public static void main(String[] args){
System.out.println(f(3));//2
System.out.println(f(5));//5
System.out.println(f(10));//55
}
public static int f(int n){//这里的n表示斐波那契数列的第n个数字
if(n==1 || n==2){//递归结束条件
return 1;
}
return f(n-1) + f(n-2);
}
}
//有n级台阶,一次只能上1步或2步,共有多少种走法?
/*
n=1 1
n=2 2(11,2)
n=3 3(111,12,21)
n=4 5(1111,112,121,211,22)
n=5 8(11111,1112,122,2111,221,1211,212,1121)
硬推导的方式,容易落下,或者蒙了
换一种方式思考:
n=1 f(1)=1
n=2 f(2)=2
n=3 最后一步怎么跨?可以跨1个台阶,可以跨2个台阶
如果跨1个台阶,意味着前面需要走到 n-1级台阶上 f(2)
如果跨2个台阶,意味着前面需要走到 n-2级台阶上 f(1)
f(3)=f(1)+f(2)
n=4 最后一步怎么跨?可以跨1个台阶,可以跨2个台阶
如果跨1个台阶,意味着前面需要走到 n-1级台阶上 f(3)
如果跨2个台阶,意味着前面需要走到 n-2级台阶上 f(2)
f(4)=f(3)+f(2)
f(n)=f(n-1)+f(n-2)
*/
class Recursion2{
public static void main(String[] args){
System.out.println(f(4));
System.out.println(f(10));
}
public static int f(int n){
if(n==1 || n==2){
return n;
}
return f(n-1)+f(n-2);
}
}