递推与递归 dfs bfs

递推呢 是根据一个递推式 并加个循环依此从a1推到an;很不错的方法不会爆栈。
然后递归呢就是自己调用自己吧,把一个大问题逐渐分而治之,变为小问题,再最后变为可以直接返回值的问题时,一层又一层返回。
以斐波那契数列为例,递推 a[1]=1;a[2]=1;while(i=3;i<=n;i++)a[i]=a[i-1]+a[i-2];
然后递归呢,int f(int n){if(n1)return 1;if(n2)return 1;return f(n-1)+f(n-2);}

递归的好处呀是写代码可以更短更简洁,但同时也就更难以理解。
同时递归也有坏处,无记忆性的递归会导致大量的重复计算,造成计算浪费,也就是会浪费更多的资源和时间,而且递归层数过深会导致爆栈。

dfs就是递归的一个典型应用,深度优先搜索。
大致的模板就是 dfs(int n)
然后向与n连接的方向拓展 我们就假设上下左右吧。
先检查n上面的元素,如果该元素符合要求,我们就用记忆数组,记忆该元素已被查找过(剪枝);然后再对该元素dfs
即 if(check(n2))
{
vis[n2]=1;
dfs(n2);
}
当然呢,dfs也会到达 上下左右都check失败的时候 那递归就会退回到上一层,开始上一层的上下左右遍历,这时退回来时别忘了更改记忆数组。
dfs 适用于什么找路径 以及路径的个数之类的问题。

bfs呢,广度优先遍历,bfs主要借助队列这个先进先出的性质。把第一个元素入队。再从队列取出第一个元素,check他的周边元素,能通过的入队,然后依次循环,取元素,check周边元素,入队元素。在等权图时,能保证最达到目的地的那个距离一定是最短距离。
当然如果不是等权图那就要用优先队列啦。

dfs不借助递归,我真不知道怎么用循环写。。。
dfs和bfs其实也只能处理数据较小的情况,因为你想,数据一大,dfs递归一深,不就直接爆炸了?而bfs呢?要储存太多的可能情况,数据一大,内存就爆炸。
但是呢,dfs和bfs确实是很好的东西呀。我没有白学 哈哈哈哈哈哈。
明天学最小生成树与并查集,要好好学哟。

猜你喜欢

转载自blog.csdn.net/qq_43328498/article/details/86632187