对于递归
1.在解题开始,先对样例进行分析,
- 确定题目要求的顺序
- 对题目进行递归树的形式去寻找思路例如一些典型的递归问题。
2.仔细思考 (用不停的情况+递归去完成)
顺序1:依次枚举每个数放在哪个位置
顺序2:依次枚举每个位置放什么数
通过以上两种顺序可以确定不同的做法,然后找一种做法进行分析
例如最为简单典型的两道例题: 根据题目要求的进行枚举,进行n循环与不进行n循环
递归实现指数型枚举
void dfs(int u)
{
if(u == n)
{
for(int i=0;i<n;i++)
if(st[i]==1) cout<<i+1<<" ";
cout<<endl;
return;
}
//从全局进行分析
//当一种情况结束后,会自动进行第二种情况,将所有的情况都遍历一遍
st[u]=2;
dfs(u+1);
st[u]=0;
st[u]=1;
dfs(u+1);
st[u]=0;
}
void dfs(int u)
{
if (u > n) // 边界
{
for (int i = 1; i <= n; i ++ ) printf("%d ", state[i]); // 打印方案
puts("");
return;
}
// 依次枚举每个分支,即当前位置可以填哪些数
for (int i = 1; i <= n; i ++ )
if (!used[i])
{
state[u] = i;
used[i] = true;
dfs(u + 1);
// 恢复现场
state[u] = 0;
used[i] = false;
}
}
3.通常还需对数据范围结合时间复杂度进行分析
递归一般是由一种状态转换为另一种状态
- 可以用bfs(时间复杂度高)适用于数据范围小的时候
- 可以进行模型转化
可以另作拓展如何将递归转换成非递归
对于递推
简单来说,递推则关键在于根据题目对公式进行推导,一个函数中包含另一个函数,借此来求解
可以通过所给的一些典型问题慢慢进行体会