第一讲之递推与递归上篇

news2025/4/21 11:03:14

第一讲之递推与递归上篇

  • 数据与算法的关系
  • 简单斐波那契
  • 递归实现指数型枚举
  • 递归实现排列型枚举
  • 递归实现组合型枚举

本专栏博客,根据acwing中蓝桥杯C++AB组辅导课编写

数据与算法的关系

在这里插入图片描述

简单斐波那契

简单斐波那契

在这里插入图片描述

斐波那契数列的话,只要掌握规律,就比较好解决了
0 1 1 2 3 5 8 13…

第一项是0.第二项为1,从第三项开始,下一项等于前2项之和
在这里插入图片描述

1. 递归方式

#include<iostream>
#include<cstdio>

using namespace std;

 int  fib(int n)
 {
    if(n == 1)
    {
        return 0;
    }
    else if(n == 2)
    {
        return 1;
    }
    else if(n >= 3)
    {
        return fib(n - 1) + fib(n - 2);
    }
    
   
 }
 

int main()
{
    int N;
    cin >> N;
    
    for(int i = 1;i <= N; i++)
    {
        cout << fib(i) << " ";
    }
        
    return 0;
}

但是这种方式递归,递归的次数太多,导致时间超时
在这里插入图片描述

2.保留下一项的数,来进行优化 以及递推
(使用滚动数组来进行优化)

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int main()
{
    int N;
    cin >> N;
    
    int a = 0;
    int b = 1;
    
    for(int i = 0; i < N ;i++)
    {
        cout << a << " ";
        int c = a + b;
        a = b;
        b = c;
    }
    
    return 0;
}

递归实现指数型枚举

递归实现指数型枚举

在这里插入图片描述在这里插入图片描述

首先,给大家解释一下,为什么这个叫指数型枚举
根据对这个输入样例和输出样例的观察
数有2种可能性,选与不选,
n个数的话
一组数据,就是 2 * 2 * 2 * 2 * 2 … ----> 2^n种可能性
所有数都输出,每一组数据的长度为n(考虑最坏的情况)
所以,时间复杂度是 n * 2 ^ n

这里采用dfs进行枚举实现

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

//数据范围15, 从1开始算

const int N = 16;  //记录数

//一个数有2个状态,选 1 或者 不选 0 
//用2对每个数进行初始化,表示还没有考虑这个数

int map[N]; //记录数的状态, 初始状态都为2
int u;

void dfs(int n)
{
    //数从1开始,这里下标,我也从1开始

    //结束递归条件
    if(n > u)
    {
        for(int i = 1; i <= u; i++ )
        {
            if(map[i] == 1)
            {
                printf("%d ", i);
            }
        }

        printf("\n");

        return;  //注意这步,退出这个递归, 这步不要忘记

    }

    map[n] = 1; //表示第一分支, 选这个数
    dfs(n + 1);
    map[n] = 2; //恢复现场

    map[n] = 0; //表示第二个分支,不选这个数
    dfs(n + 1);
    map[n] = 2;  //恢复现场 (这步其实可以不用)

}

int main()
{

    cin >> u;

    dfs(1);

    return 0;

}

递归实现排列型枚举

在这里插入图片描述
在这里插入图片描述

做这题之前,我们要知道什么是字典序。
字典序:在计算机中是用来比较任意两个字符串的大小,也就是比较字符串的ASCII码的大小。

这里两种方式;
1.枚举位置
2.枚举数

当然,我这里选择枚举位置

//两种方式,
// 1.枚举数
// 2. 枚举位置

//这里用的方式2,枚举位置
#include<iostream>
using namespace std;

const int N = 10;
int n;        
int path[N];   //存储数据
bool used[N];  //状态数组

void dfs(int u)
{
    if(u > n)
    {
        for(int i = 1; i <= n; i++)
        {
            if(used[i])  //这个判断,可加,可不加,因为每个数都要输出
            {
                
            cout << path[i] << " ";
            }
            
            
        }
        
        cout << endl;
        return;
    }
    
    for(int i = 1; i <= n; i++)
    {
        if(!used[i])
        {
            used[i] = true; //这个数被使用
            path[u] = i;  //这个位置枚举
            
            dfs( u + 1);   //枚举下一个位置
            
            //恢复现场
            used[i] = false;
            path[u] = 0;
        }
    }
}

int main()
{
    cin >> n;
    
    dfs(1);
    
    return 0;
}

递归实现组合型枚举

在这里插入图片描述
在这里插入图片描述

递归的话,要学会自己构建递归树
这里是枚举位置,一共有三个位置
这里按照:从小到大的顺序排列:
就要保证:每一个新加的数要大于前一个数

在这里插入图片描述

用dfs,要考虑dfs的参数有哪些
在这里插入图片描述

这里需要有三个参数
1.一共有位置的多少 (也就是选几个数)(这个一般为全局变量,可以不当做参数)
2.枚举的当前位置
3.从那个数开始枚举

这个dfs也可以认为有2个参数

#include<iostream>

using namespace std;

const int N = 30;
int n, m;
int way[N];

void dfs(int u, int start)
{
	 //剪枝
    if(u + n- start < m) return;   //如果把后面的数(n - start),都选上,都不够m个数,那么一定无解
    
    if(u == m + 1)
    {
        for(int i = 1; i <= m; i++) //打印数据(枚举位置)
        {
            cout << way[i] << " ";
        }
        cout << endl;
        
        return;  //退出函数,这步别忘记
    }
    
    for(int i = start; i <= n;i++) //枚举数
    {
        way[u] = i; //存储数据
        
        dfs(u + 1, i + 1);
        
        way[u] = 0;//恢复现场
    }
}
int main()
{
    cin >> n >> m;
    dfs(1, 1); //(第一个参数枚举当前位置,第二个参数枚举数)
    
    return 0;
}

当然,这里用剪枝对dfs进行了优化

本篇博客,讲解了常见的几种枚举类型,指数型,排列型,组合型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Danielle Foré 近日向 9to5Linux 通报了 elementary OS 7.1 的发布和全面可用性

导读Danielle For 近日向 9to5Linux 通报了 elementary OS 7.1 的发布和全面可用性&#xff0c;这是自 elementary OS 7.0 “Horus “于 2023 年 1 月发布以来&#xff0c;基于 Ubuntu 的发行版的首次重大更新。 elementary OS 7.1 引入了新的隐私功能&#xff0c;包括系统设置…

RK3568 蓝牙测试

本个章节所使用的蓝牙为E104-BT5032A,这款蓝牙芯片为免驱,只需要uart正常即可使用,理论上除了3568以外都可以使用 E104-BT5032A有几个地方需要注意,首先是他有几个管脚需要配置的,经常没去留意着三个引脚的电平配置,导致使用异常,然后就是保证uart能够正常使用即可 首先…

前端git提交后菜单的配置

1.添加元数据–》app微服务 在系统中找到自己对应的位置&#xff0c;然后点击进去找到功能用例&#xff0c;添加相应的前端路由和中文名称 2.在权限管理中的菜单管理中添加相应的菜单权限

SQL关于日期的计算合集

前言 在SQL Server中&#xff0c;时间和日期是常见的数据类型&#xff0c;也是数据处理中重要的一部分。SQL Server提供了许多内置函数&#xff0c;用于处理时间和日期数据类型。这些函数可以帮助我们执行各种常见的任务&#xff0c;例如从日期中提取特定的部分&#xff0c;计…

Photoshop 2024(ps ai beta) v25.0

Photoshop 2024是一款业界领先的图像编辑软件&#xff0c;被广泛应用于设计、摄影、插图等领域。以下是这款软件的一些主要功能和特点&#xff1a; 丰富的工具和功能。Adobe Photoshop 2024提供了丰富的工具和功能&#xff0c;可以帮助用户对图像进行编辑、修饰和优化。它支持…

Linux 挂载磁盘到指定目录

问题&#xff1a;公司分配了数据磁盘&#xff0c;但是分区也没有挂载到目录 首先 df -h 查看一下挂载点的情况 查看服务器上未挂载的磁盘 fdisk -l 注&#xff1a;图中sda、sdb &#xff08;a、b指的是硬盘的序号&#xff09; 分区操作 我们可以看到b硬盘有536G未分区&…

【Java】智慧工地云SaaS源码,AI服务器、硬件设备讲解视频

智慧工地是指运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分…

JVM——一些零散的概念(后续学习深入了再补充)

Native 凡是带了native关键字的&#xff0c;说明Java的作用范围的达不到了&#xff0c;需要调用底层C语言的库 调用native方法&#xff0c;会进入本地方法栈&#xff0c;调用本地接口(JNI) JNI的作用&#xff1a;扩展Java的使用&#xff0c;融合不同的编程语言为Java所用 它在内…

Proteus仿真--一种智能频率计的设计与制作(AVR单片机+proteus仿真)

本文介绍一种基于AVR单片机实现的一种智能频率计Proteus仿真实现&#xff08;完整仿真源文件及代码见文末链接&#xff09; 简介 硬件电路主要分为单片机主控模块、频率计模块、LCD1602液晶显示模块以及串口模块 &#xff08;1&#xff09;单片机主控模块&#xff1a;单片机…

nginx详细安装教程

一、简介 1-1 什么是 nginx Nginx 是高性能的 HTTP 和反向代理的web服务器&#xff0c;处理高并发能力是十分强大的。 Nginx 可以作为静态页面的 web 服务器&#xff0c;同时还支持 CGI 协议的动态语言&#xff0c;比如 perl、php 等。但是不支持 java。Java 程序只能通过与 …

unity【动画】操作_角色动画控制器 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 导入资源 添加URP渲染管线 在Window下的包管理器搜索Universal RP 点击安装 这样再将Model机器人拖拽至场景有是有颜色的了 下面对这个资源对象的Inspecter每一个属性进行介绍 首先是Model 在这个资源对象的Ins…

NewStarCTF2023week4-逃(反序列化字符串逃逸)

打开链接&#xff0c;大致审一下php代码&#xff0c;是反序列化相关的&#xff1b; 结合题目提示&#xff0c;很典型的字符串逃逸&#xff1b; 并且属于替换修改后导致序列化字符串变长的类型&#xff1b; 看似加了一个waf函数对我们提交的内容进行了过滤替换&#xff0c;实…

【引流技术】最新头条全自动引流脚本,解放双手自动引流【引流脚本+技术教程】

软件功能&#xff1a; 评论点赞 适用于自己做头条号,去别人评论区截留,点赞,别人会收到提醒,达到回访效果 文章/视频评论 可以自己发布引流文章或视频,引导进你主页或者私信你,达到引流效果 设备需求&#xff1a; 安卓手机8.1及以上系统 文章分享者&#xff1a;Linxiaoyu…

2023年中国汽车覆盖件模具竞争格局、市场规模及行业需求前景[图]

汽车覆盖件模具是汽车车身生产的重要工艺装备&#xff0c;其设计和制造时间约占汽车开发周期的 2/3&#xff0c;是汽车换型的重要制约因素之一。汽车覆盖件模具具有尺寸大、工作型面复杂、技术标准高等特点&#xff0c;属于技术密集型产品。汽车覆盖件模具按以其冲压的汽车覆盖…

pymavlink简单使用

环境 windows10 python3.11 pymavlink2.4.40 工具 虚拟串口工具 Virtual Serial Port Driver 6.9 串口/网络调试助手 sscom5.13.1.exe 串口通信 虚拟串口 COM1, COM2 调试助手连接COM2 pymavlink连接COM1 from pymavlink import mavutil import timeconnect mavut…

ES在企业项目中的实战总结,彻底掌握ES的使用

通过之前两篇文章 了解了ES的核心概念和基础使用学习进阶的DSL语法处理复杂的查询 这段时间通过在本企业代码中对ES框架的使用&#xff0c;总结了不少经验。主要分为三点 企业封装了ES原生的api&#xff0c;需要使用企业项目提供的接口实现 -------简单使用&#xff08;本章节目…

AutoDev 1.4 规模化 AI 研发辅助:团队 Prompts、自定义活文档、代码检视

在过去的两个月里&#xff0c;随着 Thoughtworks 内部的大规模 AI 辅助软件交付&#xff08;AI4SoftwareDelivery&#xff09;的展开 —— 在全球&#xff0c;有上千名的 Thoughtworker 这一个涉及不同角色、不同地区&#xff0c;以及几十场内部分享的活动。 我们也在 AutoDev …

【Leetcode】单链表 ---移除链表元素(创建虚拟头节点)

移除链表元素 移除链表元素题目思路图解创建虚拟头结点删除操作 代码 移除链表元素 题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 题目思路 题目思路&#xff1a; …

acme.sh签发和部署ZeroSSL泛域名证书

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 介绍 acme.sh 是个开源的shell证书生成脚本&#xff0c;他可以自动生成Let’s Encrypt 的证书…

【Spring Cloud Alibaba】seata分布式事务官方入门案例导读1(实战版)

文章目录 1. 业务介绍1.1. 用例1.2. 架构图1.3. 3个服务的代码及业务逻辑&#xff08;略&#xff09; 2. SEATA 的分布式交易解决方案3. 由Dubbo SEATA提供支持的示例&#xff08;实战&#xff09;3.1. 步骤 1&#xff1a;建立数据库&#xff0c;如seata数据库3.2. 步骤 2&…