递归专题

一、递归三要素

(1)明确递归终止条件;---不再往下进行了 

(2)给出递归终止时的处理办法; 

(3)提取重复的逻辑,缩小问题规模

举例1:斐波那契数列(兔子问题)

问题描述:

      已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后,第三个月开始生小兔子,假如一年内没有发生死亡,则一对兔子开始,第N个月后会有多少

代码:

// 方法1:程序员写法
	public static int fibonacci(int n) {
		// 也可以写成if(n==0||n==1的形式)---高大上
		switch (n) {
		// 出口条件一
		case 0:
			return 0;
		// 出口条件二
		case 1:
			return 1;
		// 在方法中调用自己
		default:
			return fibonacci(n - 1) + fibonacci(n - 2);//当前月等于前一个月的数量加上前两个月的数量
		}
	}

// 方法2:我的写法
	public static Long fibonacci1(int i) {
		if (i == 1 || i == 2)
			return 1L;// 漂亮(一层一层循环--解决了数据溢出的问题)
		else
			return fibonacci1(i - 1) + fibonacci1(i - 2);
	}

      三要素说明:上面的fibonacci()就是一个递归的方法; 首先,他在方法内部调用了自己(return fibonacci(i-1)+fibonacci(i-2)); 然后,有明确的递归终止条件(当i为1,或者为2的时候); 其次,有给出递归终止时的处理办法(return 1); 最后,提取重复的逻辑,缩小问题规模;

补充:假如不使用递归,可以使用循环实现,理论上所有递归都可以用循环实现,但是复杂了很多

兔子问题:点击打开链接点击打开链接

举例2:n阶阶乘问题

// 方法1:计算阶乘的方法,典型的递归方法
	public static long factorial(long n) {
		if (n >= 1) {
			// 递归方法特点一:在方法中调用自己
			return n * factorial(n - 1);
		} else {
			// 递归方法特点二:有至少一个出口条件
			return 1;
		}
	}

举例3:自然数[1,max]的求和

public int sumByMax(int max){
        if(max>=2){
            return max+sumByMax(max-1);
        }else{
            return max;
        }
}

递归简单理解:找到了给予其返回值,层层回溯--理解为多层函数嵌套

其它问题:青蛙跳台阶,迷宫问题,或者最经典的汉诺塔问题,八皇后问题

台阶描述:已知一个楼梯有n个台阶,每次可以选择迈上一个或者两个台阶,求走完一共有多少种不同的走法?

未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值