递归的思想

递归思想

  1. 什么是递归?
    一个方法出现了自己调用自己,就是递归。
    自己调用自己,可以是直接调用,也可以间接调用。

     void a(){
     a();//直接调用自己
     }
    
     void a(){
     b();//间接调用自己
     }
     void b(){
     a();
     }
    
  2. 递归要注意?

  • 如果不加任何条件的无限递归,那么会报错。
    StackOverflowError:栈内存溢出错误。
  • 正确的递归,一定是限制条件,即有出口。
  • 用递归前要先找到对应的数学规律。
  1. 递归实例
/*
计算斐波那契数列(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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值