一.关于由数据范围反推算法复杂度及其算法

关于输入输出:问题规模小于105:cin,scanf都差不多,但是要是大于105推荐使用scanf和printf。

二.关于递归

1.定义

自己调用自己

2.注意事项:

  • 判断递归结束的边界
  • 少调用局部变量,会占用很大的内存
  • 要怎么调用自身

3.每个递归都可以转化成递归搜索树

例如计算斐波那契数列可以转化成如下(这里不讨论剪枝,也就是不把重复的剪掉)

三.递归练习

1.递归实现指数型枚举

https://www.acwing.com/problem/content/94/

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; 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);
puts("");
return;
} st[u] = 1;
dfs(u + 1);
st[u] = 0;//回溯,要恢复原来的状态 st[u] = 2;
dfs(u + 1);
st[u] = 0;
} int main()
{
scanf("%d", &n);
dfs(1);
return 0;
}

2.递归实现排列型枚举

https://www.acwing.com/problem/content/96/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 10;
int st[N];
bool used[N];
int n; void bfs(int u)
{
if (u > n)
{
for (int i = 1; i <= n; i++) printf("%d ", st[i]);
printf("\n");
return;
}
for (int i = 1; i <= n; i++)
{
if (!used[i]) //表示i没有被用过
{
used[i] = true;
st[u] = i;
bfs(u+1);
st[u] = 0;
used[i] = false;
}
}
} int main()
{
scanf("%d", &n);
bfs(1);
return 0;
}

关于上面递归算法的时间复杂度分析:

第一层中的基本操作是for循环进行深搜,遍历为O(n),然后递归中有n个这样的函数,也就是n个分支。第二层也是一个for循环,然后循环中有n-1个分支,时间复杂度是O(n(n-1))。第三层就是O(n(n-1)(n-2)),以此类推,最后一层是的时间复杂度是O(nn!)。所以总的时间复杂度是O(n(1+n+n(n-1)+...+n!)),该循环是大于O(n!)的,经过放缩法可以证明是小于O(3n!)。所以最终时间复杂度为O(n*n!)

3.递归实现组合型枚举

https://www.acwing.com/problem/content/95/

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std; const int N = 30;
int n,m;
int st[N];
bool path[N]; void dfs(int u,int t)
{
if(u == m)
{
for(int i = 0 ; i < m ; i ++ ) printf("%d ", st[i]);
printf("\n");
return;
}
for(int i = t; i <= n ; i++)
{
if(u==0&&i + m - 1 > n ) break;
if(!path[i])
{
st[u] = i;
path[i] = true;
dfs(u+1,i+1);
if(u)path[i] = false;
}
}
}
int main()
{
scanf("%d%d", &n, &m);
dfs(0,1);
return 0;
}

Acwing_蓝桥_递归的更多相关文章

  1. 算法基础_递归_求杨辉三角第m行第n个数字

    问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...

  2. 020--python函数基础知识考试(包括:函数_递归等知识)

    1.列举布尔值为 False 的值 空,None,0, False, '', [], {}, () 2.写函数: 根据范围获取其中 3 和 7 整除的所有数的和,并返回调用者:符合条件的数字个数以及符 ...

  3. python基础-基础知识考试_day5 (包括:函数_递归等知识)

    老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, '', [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有数的和, ...

  4. PKU《程序设计》专项课程_递归汉诺塔问题

    取自coursera.org上公开课北京大学<C程序设计进阶> 递归调用注意的点 1.关注点放在求解的目标上,递推是,目标放在开头 2.找到第N次和第(N-1)次之间的关系,通项公式 3. ...

  5. 算法基础_递归_给定一个数字n,打印出所有的划分等式

    问题描述: 给定一个数字n,打印出所有的划分等式 例: n = 3 3 2+1 1+1+1 解题源代码: import java.util.Scanner; /** * 给定数字n,打印出其所有用加法 ...

  6. 算法基础_递归_给定m个A,n个B,一共有多少种排列

    问题描述: 给定m个A,n个B,一共有多少种排列 解题源代码: /** * 给定m个A,n个B,问一共有多少种排列 * @author Administrator * */ public class ...

  7. C_数据结构_递归实现累加

    # include <stdio.h> long sum(int n) { //用递归实现: ) ; else ) + n; /* 用for循环实现: long s = 0; int i; ...

  8. 温故而知新_C语言_递归

    递归. 是的,差不多就是这种感觉.上面就是类似递归的显示表现. 2017 10 24更新: 递归这个问题放了很久.也没有写.大概是自己还没有好好理解吧. 在这里写下自己理解的全部. 一 何为递归. 字 ...

  9. javase(2)_递归&迭代

    一.递归  程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题 ...

随机推荐

  1. 不会一致性hash算法,劝你简历别写搞过负载均衡

    大家好,我是小富~ 个人公众号:程序员内点事,欢迎学习交流 这两天看到技术群里,有小伙伴在讨论一致性hash算法的问题,正愁没啥写的题目就来了,那就简单介绍下它的原理.下边我们以分布式缓存中经典场景举 ...

  2. javascript随机变色--案例

    1.打开网页,网页效果如图所示 代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset=" ...

  3. Linux增加用户

    Linux增加用户 注意一个不加-m不会出现家目录 sudo useradd Hans -m sudo passwd Hans sudo usermod -s /bin/bash Hans sudo ...

  4. 详解__int128

    前言 如果遇到 long long 开不下的情况,可以使用 __int128 来博一把! note :__int128 仅 \(64\) 位 \(GCC G++\) 支持,不在 \(C++\) 标准中 ...

  5. macos下命令行通过ndk编译android下可以执行的ELF程序(并验证opencl的调用)

    源码如下,实现把一个JPG保存成灰度图格式的BMP 1 //jpg2bmp.cpp 2 #include <stdio.h> 3 #include <inttypes.h> 4 ...

  6. Cesium中级教程9 - Advanced Particle System Effects 高级粒子系统效应

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 要了解粒子系统的基础知识,请参见粒子系统入门教程. Weathe ...

  7. springMvc 启动过程

    转载自https://www.jianshu.com/p/dc64d02e49ac 这里给出一个简洁的文字描述版SpringMVC启动过程: tomcat web容器启动时会去读取web.xml这样的 ...

  8. a-b转换A-B

  9. docker镜像中文件丢失

    背景介绍 笔者创建了一个镜像,然后在不同的主机上启动,发现有的能启动,有的却不行,报错信息为找不到文件. 犹记得当初有人介绍,只要docker镜像做好了,拿到任何地方都可以用,此处好像不成呢,好诡异的 ...

  10. python11day

    昨日回顾 函数的参数: 实参角度:位置参数.关键字参数.混合参数 形参角度:位置参数.默认参数.仅限关键字参数.万能参数 形参角度参数顺序:位置参数,*args,默认参数,仅限关键字参数,**kwar ...