递归的介绍
1 递归的概念
函数调用自身来解决问题
2 递归的关键要素
(1)终止条件:直接解决绩效规模问题的方法
(2)递归表达式:用于解决一个更小的子问题,再将子问题的答案合并成为当前问题答案
递归如何实现
1 实现过程
(1)将一个复杂问题分解为更小的、相似的问题
(2)通过函数自身调用自身来解决这些更小的问题
(3)通过递归终止条件来结束递归
2 细节
(1)确保有递归出口,避免无线递归,可能导致运行错误RE、超内存MLE、超时TLE。
(2)考虑分界条件,递归出口可能不止一个
(3)避免不必要的重复计算
3 递归函数基本结构
返回类型 函数名(参数列表){
if(满足终止条件){ //基本情况(递归终止条件)
//返回终止条件下的结果
}else{ //递归表达式
//降温贴分解为规模更小的子问题
//递归调用解决子问题
//返回子问题结果
}
}
递归和循环的比较
递归 | 循环 |
|
|
部分情况下,递归和循环可以相互转化
例题
1 斐波那契数列
定义:F(0) = 0 F(1) = 1 对于 n > 1,F(n) = F(n-1) + F(n-2)
求斐波那契数列的第n项
int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
为了减小空间复杂度,我们使用带备忘录的递归:
long long dp[n];
long long fib(int n){
if(dp[n]) return dp[n];
if(n<=2) return 1;
else return dp[n]=(fib(n-1)+fib(n-2));//dp[n]的记录免去重复计算
}