基础算法之递推与递归

递推

根据题目能写出递推式与边界情况,那么就可以用递推来解决问题

递归

递归这里最简单的三种应用:

1.指数型枚举,思路是我们利用递归函数,一个一个处理要枚举的数,每个数都有两种情况,选或者不选,最后我们枚举完了所有的数,也就是到了边界,就可以处理/输出当前的情形了

2.组合型枚举,这个问题的解决是在上一个枚举的基础上,加上一个剪枝得到的,每次我们进入函数的时候首先判断一下,如果当前选的数目大于要选择的目标数目,或者当前选的数目加上还未选的数目小于要选择的目标数目,则返回

3.排列型枚举,这个问题的思路是,函数的参数是位置,当位置大于我们排列的数目时,就到了边界,可以统计当前结果了,除此之外,我们枚举可以填的数字,如果已经填过,那么跳过这个循环,没有填过,那么填上,并改变标志数组,

排列型枚举的解决问题的思路和深入浅出程序设计竞赛上面回溯法的模板很相似,那个模板是,函数的参数是递归的层数,或者说要填的第几个空。递归的边界是,所有的空都被填完了,这时记录更新答案,判断最优解。接下来是枚举这个空能填的选项,可以填,就填,保存现场,递归,恢复现场,

void dfs(int k) { // k表示递归的层数,或者说要填第几个空
	if (所有的空都填完了) {
		记录更新答案/判断最优解;
		return;
	}
	for (枚举当前空能填的选项) {
		if (这个选项合法) {
			记录下这个空,保存现场;
			dfs(k + 1);
			取消这个空,恢复现场;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值