今天和大家一起来讨论一下递归:
我们尽可能使按照解题的思路来讨论递归,对于这个在计算机内部具体是怎样实现的,我们不做深入讨论,这里仅仅是简单的讨论一下:
求1 ~ n序列的和:1 + 2 + 3 + ... + n:由于1的时候是1,2的时候是3,3的时候是6,很容易就看出来了,我们可以用一个数组递推这写过去
for(int i = 1;i <= 100;i ++)
a[i] += a[i- 1];
但是显然也是为了明白递归运行原理我们也可以选择用递归来写(大问题可以有小问题解决,每一步的处理方式都是一样的,递归问题最底部a[1] = 1)
递归写法:
#include <iostream>
using namespace std;
int n;
long long dfs(int u){
if(u == 1)return 1;
else return u + dfs(u - 1);
}
int main(){
cin >> n;
cout << dfs(n);
return 0;
}
我们选择这个简单的程序来看看递归来粗略的看看这个过程计算机是如何实现的,return的功能:
(什么时候用return)
1.0表明最终的那个条件,开始向上回溯
2.0符合递归的条件,进入递归,按照树的一个枝干向下递归
以上就是递归在计算机当中的具体执行过程,这个return的确很神奇,可以自己建造红色,能后一直存储着这个红色,还能搭建蓝色空间回去;当然了,这是线性递归,就是完全递归下来,然后完全递归回去;还有树形递归,先一条路下来,然后满足最终条件就回去,然后满足递归条件再下来;
好的,以上我们简单的讨论了递归在计算机当中的实现过程:
我们开始讨论应该用什么样的思维步骤来写递归:
下面我们通过三个题目,来讨论如何代码:
92. 递归实现指数型枚举 - AcWing题库
按照一个思路不重不漏的枚举出所有答案,找到每次都递归的条件,确定树形结构;
按照树的左边一直写下去,一直写到递归的的初始条件(把这个条件放到前面),然后开始写右边的树,我们最后输出的时候直接从1看到n,然后那个数字该不该输出 在st[]里面 已经说清楚了 所以不需要for循环
94. 递归实现排列型枚举 - AcWing题库
每一位都有可能是1~n中的每一个数字,所以for循环必不可少
但是用过的就不能再用了,写的流程和之前的流程是一样的
93. 递归实现组合型枚举 - AcWing题库
每一位都可能是1~n中的每一个数字,所以for循环必不可少,但是第一次是1~n,第二次是2~n,第三次是3~n,写的流程和之前的流程是一样的
//之前还不理解为什么sort++ 不能变成sort + 1
//因为递归回来之后,进行下一次递归的时候sort 的值是增加了的
#include <iostream>
using namespace std;
const int N = 30;
int st[N];
int n,m;
void dfs(int u,int sort){
if(u > m){
for(int i = 1;i <= m;i ++)cout << st[i] << " ";
puts("");
return;
}
for(int i = sort;i <= n;i ++){
st[u] = i;
sort ++;
dfs(u + 1,sort);
}
}
int main(){
cin >> n >> m;
dfs(1,1);
return 0;
}
以上就是递归的实现流程,和我们应该怎么样子写递归的过程