写点什么

【从 0 到 1 学算法】2. 递归

作者:Geek_65222d
  • 2022 年 10 月 02 日
    河南
  • 本文字数:1065 字

    阅读完需:约 3 分钟

两种输入输出方式的区别

  1. printf 和 scanf,稍微写起来有点长,但速度巨快

  2. out,稍微写的短一点,但速度稍慢

  3. 如果输入输出总数小于 10^5,两者没什么区别,我们经常用 cin 和 cout 来加快写输入输出时间,如果大于则选 printf 和 scanf,避免超时

递归

递归搜索树

结论:所有递归问题如果不是很明白,都可以用一个方法来解决,那就是画出题目其中一个案例的递归搜索树,把复杂问题变成图像问题,更方便去解决抽象问题,通过一个案例图像就可以联想其他案例的解决方法



根据斐波那契数列的定义,来推到出 6 的斐波那契值,因为 f(n) = f(n-1) + f(n-2),f(1) = 1,f(2) = 2,这几个条件可以推出任意一个数的斐波那契值,算到 f(1)和 f(2)的时候,就要往前回溯值,遇到同一个节点就要相加,直到达到最后一个夫节点算是这个数的斐波那契值为止,由此我们可以写出斐波那契数列的代码形式


#include <cstring>#include <iostream>#include <cstdio>
using namespace std;
int f(int n){ if(n == 1) return 1; if(n == 2) return 2; return f(n-1) + f(n-2);}
int main(){ int n; cin >> n; cout << f(n) << endl; return 0; }
复制代码


简单来说就是函数自己调用自己的过程

一些常用的数学知识

  1. 2^1 到 2^10 需要知道分别是 2,4,8,16,32,64,128,256,512,1024

  2. 2^20 约等于为 10^6

  3. 2^16 是 65536

  4. 2^15 是 32768

  5. 2^6 约等于 10^18

经典递归题讲解

92. 递归实现指数型枚举 - AcWing题库



先画出其中一种情况的递归搜索树的图,便于理解,进而写出代码


# acwing 92. 递归实现指数型枚举 #include <iostream>#include <cstdio>#include <algorithm>const int N = 16;int n;int st[N];  //状态,记录每个位置的当前状态,0表示还没考虑,1表示选它,2表示不选它void dfs(int u){    if(u>n)    {        for(int i = 1; i <=n; i++)            if(st[i] == 1)                printf("%d",i);        printf("\n");        return;    }        st[u] = 2;//第一个分支    dfs(U+1);    st[u] = 0;        st[u] = 1;//第二个分支    dfs(u+1);    st[u] = 0;}
int main(){ cin >> n; dfs(1); return 0;}
复制代码


题解:我们默认第一个位置是 1,进入 dfs 函数时,先判断是否达到结束条件,如果满足结束条件则输出对应满足条件的值,达到第一个分支时,是该位置不选的情况进行赋值,然后进入下一个位置再继续判断,为了不让子树去影响父树,所以要将该位置恢复到赋值前的状态,这样下一个位置进行判断赋值的时候就不会收到影响了,接着达到第二个分支,是该位置选的情况进行赋值,接下来的过程跟不选的情况是一样的

发布于: 刚刚阅读数: 4
用户头像

Geek_65222d

关注

还未添加个人签名 2022.09.09 加入

还未添加个人简介

评论

发布
暂无评论
【从0到1学算法】2.递归_10月月更_Geek_65222d_InfoQ写作社区