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

关于输入输出:问题规模小于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. Sentine熔断降级进阶

    sentinel和springCloud整合 减少开发的复杂度,对大部分的主流框架,例如:Web Servlet.Dubbo.Spring Cloud.gRPC.Spring WebFlux.Reac ...

  2. jmeter和JDK安装教程(Windows)

    1.JDK的安装及环境变量配置 1.JDK的下载安装 JDK官网下载地址:https://www.oracle.com/java/technologies/downloads 然后注册账号,开始下载, ...

  3. leetcode 233. 数字 1 的个数

    问题描述 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数. 示例: 输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 . 问 ...

  4. Sentry 开发者贡献指南 - 数据库迁移

    Django 迁移是我们处理 Sentry 中数据库更改的方式. Django 迁移官方文档:https://docs.djangoproject.com/en/2.2/topics/migratio ...

  5. 【经验总结】CodeBlocks使用mingw64

    CodeBlocks使用 标签:c++ 一.安装并配置mingw-w64 使用中发现CB默认的编译器版本过低,c++11的一些东西无法使用,比如string中的stoi函数,因此尝试安装新版本的编译器 ...

  6. cesium加载gltf模型点击以及列表点击定位弹窗

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 之 ...

  7. 使用Cesium Stories在3D Tilesets中检查Features

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 我们创建了3D Tiles用以流式化.可视化和分析大量的三维内容 ...

  8. 一文读懂HarmonyOS服务卡片怎么换肤

    作者:zhenyu,华为软件开发工程师 关注HarmonyOS的小伙伴肯定对服务卡片已经很熟悉了.服务卡片(也简称为"卡片")是FA(FeatureAbility,元服务)的一种界 ...

  9. gorm创建记录及设置字段默认值

    package main import ( "database/sql" "gorm.io/driver/mysql" "gorm.io/gorm&q ...

  10. ansible roles实践——服务器初始化

    1.服务器初始化可以做哪些工作 关闭selinux ntp同步时间 修改dns为自建dns 配置ssh互信 修改yum源 设置主机名 内核参数优化 安装jdk 2.roles编写