引入:
递归代码模板:
1.先写出口
2.再写普通相同情况
eg: 斐波那契数列 1 2 5 8 13…
int fibo(int a){
if(a == 0 || a == 1){ //先写出口
return 1;
}
else{
return fibo(a - 1) + fibo( a - 2);
}
}
思考是否具有递归特性:
1>思考普遍情况
1.当为极端情况时(自下而上 最”下”的情况)的情况 eg:跳台阶,只有一个台阶
2.当为极端条件 + 1 时的情况 eg:跳台阶,有两个台阶


  1. 2>
    推及到n时,(n - 1)对n的情况,是否只要知道了(n - 1),或(n - 2)等等以此类推 就能根据普遍情况得到n

换言之,即 想要得到n的结果,是否需要得到(n - 1/2/3/..)的结果

DFS—深度优先算法
大概思路:不撞南墙不回头 依次走完所有路
eg:

  1. kotori和素因子(A组,B组)
    void dfs(int d,int sum){//重点
    if(d == n){//先写退出条件—深度达到最大值
     ans = min(ans,sum);
     return;
    
    }
    for(int i = 0; i < v[d].size(); i++){//从最底层开始,一次选一个值
     if(!vis[v[d][i]]){
         vis[v[d][i]] = 1;//标记该值,表已经被用过
         dfs(d + 1, sum + v[d][i]); //选完一个换下一个
         vis[v[d][i]] = 0; //上一个选完后回头,换一个路,将之前标记过的值还原
     }
    
    }
    }

简单想法:
画树状图
最底层即为出口 返回的是具体值
其余的都是从上返回下面的递归式
long long dfs(int k,int n){//栈内0 栈外n
if(dp[k][n]){
return dp[k][n];
}
if(n == 0){//栈外没有元素 值为1 出口
return 1;
}
if(k == 0){//栈内没有元素
return dfs(k+1,n-1);
}
return dfs(k+1,n-1) + dfs(k-1,n);

}