蓝桥杯Learning

Part 1 递归和递推

1. 简单斐波那契数列

n = int(input())

st = [0]*(47) # 注意这个地方,需要将数组空间设置的大一些,否则会数组越界
st[1] = 0
st[2] = 1
# 这个方法相当于是递推,即先求解一个大问题的若干个小问题
def dfs(u):
    if u ==1:
        print(st[1],end=" ")
    if u ==2:
        print(str(st[1])+" "+str(st[2]),end=" ") # 注意在这个地方,在acwing当中需要进行强制类型转换
    if u>2 :
        for i in range (3,u+1):
            st[i] =st[i-1]+st[i-2]
        for i in range (1,u+1):
            print(st[i],end=" ")
    return
dfs(n)

# 方法2 采用递归的方法,递归可以看做将一个大问题分解为若干个小问题,进行求解
def fibonacci(n):
    if n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        fib_list = [0, 1] # 注意这个地方,python列表的下标从0开始
        for i in range(2, n):
            fib_list.append(fib_list[i-1] + fib_list[i-2])
        return fib_list[-1]

n = int(input())
# 输出斐波那契数列的前 n 个数字
for i in range(1,n+1):
    print(fibonacci(i), end=' ')

2. 递归实现指数型枚举

# 指数枚举相当于每一个位置的数字可以选择或者不选
n = int(input())

st = [0] * (n+1) #python当中的下标是从0开始的。该数组用于保存每个位置数字的选择情况。0表示无判断,2表示不选,1表示选

def dfs(u):
    if u > n:
        for i in range(1, n + 1):
            if st[i] == 1:
                print(i, end=' ')
        print()
        return #注意,这里需要一个return

    st[u] = 2
    dfs(u + 1)      # 第一个分支:不选
    st[u] = 0       # 恢复现场

    st[u] = 1
    dfs(u + 1)      # 第二个分支:选
    st[u] = 0

dfs(1)

3. 递归实现排列型枚举

# 顺序1 依次枚举每个数放到哪个位置
# 顺序2 依次枚举每个位置放哪个数

# 相当于是在求解一个全排列问题
# 排列问题当中需要一个判断是否重复的数组

# 方法1:
n = int(input())
st = [0]*(n+1) # 表示当前的状态,0表示还没放数,1-n表示放了哪一个数
used =[False]*(n+1) # 表示某个数是否被用过, true表示已经用过

def dfs(u):
    if u>n: #边界
        for i in range (1,n+1):
            print(st[i],end=' ') #打印每一个方案
        print()
        return #注意这个return的位置
    # 依次枚举每个分支,即当前位置可以填哪些数
    for i in range (1,n+1):
        if used[i] ==False:
            st[u] =i
            used[i] =True
            dfs(u+1) # 注意每次递归运行到这里的时候现场还没有恢复
            #恢复现场
            st[u] =0
            used[i] = False

dfs(1)

4.递归实现组合型枚举

n,m = map(int,input().split())
st = [0]*30

def dfs(u,s): # u表示从第几个位置开始枚举,第二个位置表示当前从哪一个数开始
    if u ==m+1: #边界,表示已经选了m个数
        for i in range (1,m+1):
            print(st[i],end=' ')
        print()
        return
    for i in range(s,n+1):
        st[u] =i
        dfs(u+1,i+1) # 注意这个地方,u相当于是指示当前是枚举第几个位置,i相当数是指示当前位置开始可以选择的最小的数

        st[u] =0 # 恢复现场

dfs(1,1)

方法2:

n,m = map(int,input().split())
st = [0]*30

def dfs(u,s): # u表示从第几个位置开始枚举,第二个位置表示当前从哪一个数开始
    if u+n-s < m: # 剪枝,相当于想后面所有数都选上都不够m个,则无解
        return
    if u ==m+1: #边界,表示已经选了m个数
        for i in range (1,m+1):
            print(st[i],end=' ')
        print()
        return
    for i in range(s,n+1):
        st[u] =i
        dfs(u+1,i+1) # 注意这个地方,u相当于是指示当前是枚举第几个位置,i相当数是指示当前位置开始可以选择的最小的数

        st[u] =0 # 恢复现场

dfs(1,1)

5. 带分数问题

n = int(input())
st = [False] * 10
backup = [False] * 10

ans = 0


def check(a, c):
    b = n * c - a * c
    if not a or not b or not c:  # a,b,c 都不可以等于0
        return False

    backup =st[:] # python当中的切片操作

    while b: # 此处需要注意将一个数各个位上的数字取出来的方法
        x = b % 10  # 取个位 先去取个位上的数字
        b //= 10  # 个位删掉
        if not x or backup[x]: # 需要去判断x是否为0,以及这个数是否被用过
            return False
        backup[x] = True

    for i in range(1, 10): # 这个 for循环相当于去判断1-9是否都已经使用过
        if not backup[i]:
            return False

    return True


def dfs_c(u, a, c):
    global ans
    if u == n:
        return
    if check(a, c) == True:
        ans += 1
    for i in range(1, 10):  # 这部分相当于是去选c
        if st[i] == False:
            st[i] = True
            dfs_c(u + 1, a, c * 10 + i) # 注意这里再一个数字后加上一位的方法
            st[i] = False


def dfs_a(u, a):  # u相当于是当前用了几个数字,a相当于当前位置a放置的数
    if (a >= n):  # 当a>n的时候,这种情况直接舍去
        return
    dfs_c(u, a, 0)  # 相当于在a的递归搜索数的叶子节点,再依次遍历 c

    for i in range(1, 10):  # 这部分相当于去选a,即全排列位置a上的数字
        if st[i] == False:
            st[i] = True
            dfs_a(u + 1, a * 10 + i)
            st[i] = False


dfs_a(0, 0)
print(ans)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux如何查看端口是否占用

在Linux中&#xff0c;有多种方法可以用来检查端口是否被占用。以下是一些常用的命令&#xff1a; netstat&#xff1a;这是一个非常通用的命令&#xff0c;可以用来查看所有端口的使用情况。如果你想查找特定的端口是否被占用&#xff0c;可以使用netstat命令配合grep。例如&…

pytest教程-13-conftest.py文件

上一小节我们学习了fixture的作用域&#xff0c;本小节我们学习一下pytest conftest.py文件的使用方法。 conftest.py文件的作用 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在py…

Java学习-简单算法与正则表达式

1.排序算法 a.冒泡排序&#xff1a; 每轮找出当前最大值&#xff0c;冒到前面&#xff0c;循环长度减一次&#xff0c;每轮从1个比较到长度减i个 b.选择排序&#xff1a; 每一轮选择每一个位置的数组元素和后面的元素比较&#xff0c;从第i1个比较到最后一个 选择排序的优化&am…

Netty的InboundHandler 和OutboundHandler

一、InboundHandler 和OutboundHandler的区别 在Netty中&#xff0c;"inbound"表示来自外部来源&#xff08;如网络连接&#xff09;的数据&#xff0c;而"outbound"则表示从应用程序发送到外部目标&#xff08;如网络连接或其他服务&#xff09;的数据。…

2、事件机制、DOM操作、jquery对尺寸操作、jquery添加和删除

一、事件机制 1、事件源.事件类型(事件处理程序) $(this)中的this不能加引号 $(#box).click(function () {$(this).css(background-color,blue)//点击颜色变为蓝色 })2、事件源.on/bind(事件类型&#xff0c;事件处理程序) $("#box").on(dbclick,function () {$(…

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候&#xff0c;会出现这种情况&#xff1a; mysql -u root -p Enter Password > ‘密码’ 错误&#xff1a;ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者&#xff1a;错误…

CTFHUB--文件包含漏洞--RCE

文件包含漏洞 文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。有时候由于网站功能需求&#xff0c;会让前端用户选择要包含的文件&#xff0c;而开发人员又没有对要包含的文件进行安全考虑&#xff0c;…

修改centos7的dns解决docker拉取镜像超时问题

近期在一台centos7的服务器上部署系统&#xff0c;拉取docker镜像时总是超时&#xff0c;如图所示。网上有教程说&#xff0c;可以修改操纵系统的dns地址&#xff0c;试了一下&#xff0c;果然搞定。 打开dns配置文件 sudo vi /etc/resolv.conf发觉里面的地址设为114.114.114…

Unity铰链四杆机构设计和运动仿真

一、效果图 设定好各边长度和转速后&#xff0c;点击【设置并启动】&#xff0c;自动生成一个机构模型&#xff0c;并按照原理进行运转 二、铰链四杆机构介绍 机架&#xff1a;A和D是固定位置&#xff0c;叫做机架。 曲柄&#xff1a;B点绕A点旋转&#xff0c;构成曲柄。 连…

什么是VR数字文化遗产保护|元宇宙文旅

VR数字文化遗产保护是指利用虚拟现实&#xff08;VR&#xff09;技术来保护和传承文化遗产。在数字化时代&#xff0c;许多珍贵的文化遗产面临着自然衰退、人为破坏或其他因素造成的威胁。通过应用VR技术&#xff0c;可以以全新的方式记录、保存和展示文化遗产&#xff0c;从而…

sqlserver 改变decimal 精度

遇到需要修改精度的业务场景: 可能是数据库存的精度和小数位太多,需要减少: 比较全能的CAST转换: CAST(你的字段 AS DECIMAL(38,10)) ↓ CAST(你的字段 AS DECIMAL(38,2)) 在 SQL Server 中&#xff0c;decimal 数据类型通常使用两个参数来定义其精度和小数位数。这两个…

MySQL进阶:视图存储过程存储函数触发器

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;大厂高频面试——各类SQL语句性能调优经验 &#x1f4da;订阅专栏&#xff1a;MySQL进阶 希望文章对你们有…

leetcode 3.1

leetcode hot 100 双指针1.三数之和2.接雨水 多维动态规划1.最长公共子序列 双指针 1.三数之和 三数之和 排序 双指针的方法&#xff0c;固定一个数nums[i], 用两数和找target - nums[i] 的数需要注意两点: 1.需要去掉重复数字 while (l < r && nums[l] nums[…

【Numpy】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘shape‘

【Numpy】成功解决AttributeError: ‘Tuple’ object has no attribute ‘shape’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

Java+SpringBoot+Vue:招生宣传的全栈解决方案

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

linux系统Jenkins工具配置webhook自动部署

Jenkins工具webhook自动部署 webhook自动部署webhook的意义操作流程jenkins页面操作gitlab页面操作 webhook自动部署 webhook的意义 自动化部署&#xff1a;Webhook 可以在代码提交、合并请求或其他特定事件发生时自动触发 Jenkins 构建和部署任务&#xff0c;从而实现自动化…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…

[机缘参悟-160] :人的感知系统是及其有限的,从电磁波的频谱、声波的声谱,看人类只看感知到物质世界的一小部分,无法感知到全部真相

目录 一、人自身是如何感知物质世界的&#xff1f; 1.1 五官 1.2 关于视觉、光、电磁波 1.2.1 视觉系统 1.2.2 感光细胞 ​编辑 1.2.3 光波与人眼的光波范围 1.2.4 电磁波 1.2.5 通过科学仪器和技术可以拓展人对电磁波的感知 1.2.6 太阳光的光谱 1.2.6 光不仅仅用于…

安卓虚拟机ART和Dalvik

目录 一、JVM和Dalvik1.1 基于栈的虚拟机字节码指令执行过程 1.2 基于寄存器的虚拟机 二、ART与Dalvikdex2aotAndroid N的运作方式 三、总结 一、JVM和Dalvik Android应用程序运行在Dalvik/ART虚拟机&#xff0c;并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。 Dalvik…

GO泛型相关

通过引入 类型形参 和 类型实参 这两个概念&#xff0c;我们让一个函数获得了处理多种不同类型数据的能力&#xff0c;这种编程方式被称为 泛型编程。 2. Go的泛型 类型形参 (Type parameter)类型实参(Type argument)类型形参列表( Type parameter list)类型约束(Type constr…