递归

递归:

把大问题拆成很多小问题,然后再把小问题拆成更多的小问题,
当我们把更多小问题解决了,小问题也解决了
随着小问题的解决,大问题也随之解决了

在方法本身不断的调用方法自己

递归注意事项:
递归一定要有出口,内存溢出
递归次数不宜过多,内存溢出

    /*
     * 需求:求5的阶乘
     * 5! = 5 * 4 * 3 * 2 * 1;  //120
     * 5! = 5 * 4!;					//120
     * 		4! = 4 * 3!;			//24
     * 			3! = 3 * 2!;		//6
     * 				2! = 2 * 1!;	//2
     * 					1! = 1;     //1
    	n! = n * (n - 1)!
public class RecurrenceDemo {
	public static void main(String[] args) {
		int result = jC(5);
		System.out.println(result);//120
	}
	
	
	//求一个数的阶乘
	public static int jC(int n) {
		//必须要有出口
		if(n == 1) {
			return 1;
		}
		else {
			//进栈从5开始,弹栈后是从1开始计算
			//n=5,进来,不等于!=1,n*jC(5-1)---------------5*24=120
			//n=5-1=4,进来,不等于1,n*jC(4-1)-------------4*6=24
			//n=4-1=3,进来,不等于1,n*jC(3-1)-------------3*2=6
			//n=3-1=2,进来,不等于1,n*jC(2-1)-------------2*1=2
			//n=2-1=1,进来,等于==1,返回	1
			return n * jC(n - 1);
		}
	}
	
}

递归不死神兔

/*
 * 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
 * 		     小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
 *  	     问第二十个月的兔子对数为多少?
 *  
 *  
 *  1
 *  1
 *  2
 *  3
 *  5
 *  8
 *  13
 *  
 *  规律:除了第一个月和第二月以外,其余每个月都是前两个月之和
 *  斐波那契列数
 *  
 */
public class RecurrenceDemo2 {
	public static void main(String[] args) {
		int result = method(20);//6765
		System.out.println(result);
	}
	
	public static int method(int n) {
		//如果是第一个月,只有一对兔子
		if(n == 1) {
			return 1;
		}
		//如果是第二个月,也只有一对兔子
		else if(n == 2) {
			return 1;
		}
		else {
			//如果不是第一个月和第二个月,则兔子的数量是前两个月之和
			return method(n - 1) + method(n - 2);
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值