【废物研究生零基础刷算法】DFS与递归(一)典型题型

文章目录

  • 跳台阶
  • 递归实现指数级枚举
  • 递归实现排列型枚举
    • 上面两题总结
  • 递归实现组合型枚举
  • P1036选数

跳台阶

在这里插入图片描述
思路:

  • 如果 n = 1,只有一种走法(走 1 级)。
  • 如果 n = 2,有两种走法(1+1 或 2)。
  • 对于 n > 2,到达第 n 级的方法可以分解为:
  • 从第 n-1 级走 1 级上来,方案数为 f(n-1);从第 n-2 级走 2 级上来,方案数为 f(n-2)。
  • 因此,总方案数 f(n) = f(n-1) + f(n-2)。
def Fibonacci(x):if x==1: return 1if x==2: return 2return Fibonacci(x-1)+Fibonacci(x-2)n = int(input())
print(Fibonacci(n))

递归实现指数级枚举

在这里插入图片描述
思路:

  1. 顺序:从1~n依次考虑每个数选/不选,可能的结果是2^n
  2. 使用长度为n的数组st来记录每个数是选还是不选:0(不确定选不选)、1(选择)、2(不选择)
  3. 传入的参数x代表选择的位置
N = 20  # 数据范围最大 n ≤ 15,定义一个稍大的常量
st = [0] * N  # 初始化 st 数组,长度固定,所有元素为 0
n = int(input())  # 输入 ndef dfs(x):if x > n:  # 当 x 超过 n,说明所有数都考虑完了,输出方案selected = []  # 存储被选择的数字for i in range(1, n + 1):  # 检查 1 到 n 的状态if st[i] == 1:  # 如果选择这个数selected.append(i)if not selected:  # 如果没有选择任何数,输出空行print(" ")else:print(" ".join(map(str, selected)))  # 输出选择的数字,用空格分隔.map(str, selected) 的作用是将 selected 列表中的每个元素(数字)转换为字符串。return# 不选择当前数 xst[x] = 2dfs(x + 1)st[x] = 0  # 回溯,恢复状态为未考虑# 选择当前数 xst[x] = 1dfs(x + 1)st[x] = 0  # 回溯,恢复状态为未考虑dfs(1)  # 从 1 开始

递归实现排列型枚举

在这里插入图片描述
思路:

  1. 考虑每个位置能存放的数
  2. 使用布尔类型的数组st表示当前存放的状态,True表示有该数,False表示没有该数
N = 20  # 常量,稍大于 n 的最大值 15
n = int(input())  # 输入 n
arr = [0] * N  # 存储当前排列的数组
st = [False] * N  # 标记数字是否使用,0 到 n-1 表示数字 1 到 ndef dfs(x):if x > n:  # 当 x 超过 n,说明排列已填满,输出结果result = ""for i in range(1, n + 1):  # 输出 arr[1] 到 arr[n]result += f"{arr[i]:5d}"  # 每个数字占 5 个字符宽度print(result)returnfor i in range(1, n + 1):  # 枚举 1 到 n 的数字if not st[i]:  # 如果数字 i 还未使用st[i] = True  # 标记为已使用arr[x] = i  # 将 i 放入当前位置dfs(x + 1)  # 递归填下一个位置st[i] = False  # 回溯,恢复未使用状态arr[x] = 0  # 回溯,清空当前位置dfs(1)  # 从位置 1 开始填

上面两题总结

为什么回溯处理方式不同?

  1. 子集问题(指数型枚举)为什么不用for循环?
  • 决策方式:对于每个数字 x,只有“选”或“不选”两种固定选择。
  • 状态独立:选择 x 不会影响其他数字的可用性,因此不需要遍历所有可能选项,只需直接指定状态(st[x] = 1 或 2)。
  • 回溯逻辑:
    • 每次递归只处理一个数字的状态。
    • 直接设置 st[x],递归后恢复为 0,不需要额外的循环来尝试其他值。
  • 本质:这是一个二分支问题(选或不选),每个位置的决策是固定的二选一。
  1. 全排列问题为什么用 for 循环?
  • 决策方式:对于每个位置 x,需要从剩余未使用的数字中选择一个,而不是简单的二选一。
  • 状态依赖:某个数字 i 被选后,后续位置不能再用它,因此需要用 st 检查哪些数字可用。
  • 回溯逻辑:
    • 用 for i in range(1, n + 1) 遍历所有数字,检查 st[i] 是否为 False(未使用)。
    • 每次尝试一个可用的 i,标记为已用(st[i] = True),填入 arr[x],递归后回溯。
  • 本质:这是一个多分支问题(从 n 个数字中选一个),每个位置需要动态枚举当前可用的选项。

递归实现组合型枚举

在这里插入图片描述

N = 30
n, r = map(int, input().split())  # 一行输入 n 和 r
st = [False] * N  # 标记数字是否使用
arr = [0] * N  # 存储当前组合def dfs(x, start):if x > r:  # 选满 r 个数时输出result = ""for i in range(1, r + 1):  # 输出 arr[1] 到 arr[r]result += f"{arr[i]:3d}"  # 每个数字占 3 个字符宽度print(result)returnfor i in range(start, n + 1):  # 从 start 到 n 枚举if not st[i]:  # 如果 i 未使用st[i] = True  # 标记已使用arr[x] = i  # 放入当前位置dfs(x + 1, i + 1)  # 递归,下一位置从 i+1 开始st[i] = False  # 回溯arr[x] = 0  # 回溯dfs(1, 1)  # 从位置 1 开始,从数字 1 开始选

P1036选数

在这里插入图片描述

N = 30
n, k = map(int, input().split())
q = list(map(int, input().split()))  # 输入数组
st = [False] * N  # 标记是否使用
arr = [0] * N  # 存储当前组合
count = 0def is_prime(n):if n < 2:return Falsefor i in range(2, int(n ** 0.5) + 1):if n % i == 0:return Falsereturn Truedef dfs(x, start):global count  # 声明 count 为全局变量if x > k:  # 选满 k 个数sum_val = 0for i in range(1, k + 1):sum_val += arr[i]if is_prime(sum_val):count += 1returnfor i in range(start, n):  # 从 start 到 n-1 枚举数组索引if not st[i]:  # 如果 q[i] 未使用st[i] = Truearr[x] = q[i]  # 存入当前数字dfs(x + 1, i + 1)  # 下一位置,从 i+1 开始st[i] = Falsearr[x] = 0dfs(1, 0)  # 从位置 1 开始,从数组索引 0 开始
print(count)

在这里插入图片描述

为什么需要global?

  • 函数外定义 ≠ 自动可修改:
    • 在函数外定义 count = 0 只意味着它在全局作用域存在,可以被读取。
    • 但函数内的任何赋值(如 count += 1、count = 5)都会创建一个新的局部变量,除非用 global 声明。
  • 保护全局变量:
    • Python 这样设计是为了防止函数意外修改全局状态。如果你想修改,必须明确意图。

如何从索引为1开始存放?

# 读取输入并转换为整数列表
q = list(map(int, input().split()))# 在列表开头插入一个占位元素 0
q.insert(0, 0)# 打印结果
print(q)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

at32f103a+rtt+AT组件+esp01s 模块使用

AT组件使用 这里需要设置wifi名称和密码 配置使用的串口 配置上边的自动会配置,at_device 依赖了at_client 依赖sal也自动加入 依赖了串口2 uart2 连接WiFi AT+ CWJAP = TP-LINK_45A1

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类&#xff0c;只要是他的子类&#xff0c;或子类的子类&#xff0c;都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…

[漏洞篇]文件上传漏洞详解

[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的&#xff0c;“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xf…

Grok 3与GPT-4.5的“智能天花板”争夺战——谁才是大模型时代的算力之王?

2025年2月18日&#xff0c;马斯克旗下 xAI 高调发布新一代大模型Grok 3&#xff0c;号称“地球上最聪明AI”&#xff0c;在数学推理、代码生成等核心能力上碾压 GPT-4o、DeepSeek-V3 等对手。而就在同一天&#xff0c;OpenAI创始人 Sam Altman 暗示 GPT-4.5 即将登场&#xff0…

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…

3、Kubernetes 集群部署 Prometheus 和 Grafana

Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…

MySQL中Binlog Redolog Undolog区别?

MySQL中Binlog Redolog Undolog区别 在学习MySQL数据库管理和优化的过程中&#xff0c;理解和区分Binlog&#xff08;二进制日志&#xff09;、RedoLog&#xff08;重做日志&#xff09;和UndoLog&#xff08;撤销日志&#xff09;是至关重要的。这三种日志在MySQL中扮演着不同…

C++中结构体与结构体变量 和 类与对象的区别

具体区别如下&#xff1a; 结构体 -> 结构体变量 { 结构体&#xff1a;struct student{ 具体是多少&#xff0c;年龄&#xff0c;名字&#xff0c;性别&#xff0c;成绩 } 结构体变量&#xff1a; stu{ 名字&#xff1a;张三&#xff0c;年龄&#xff1a;18&#…

小迪安全23-php后台模块

cookie技术 cookie就是身份验证表示&#xff0c;通过cookie好区分每个用户的个人数据和权限&#xff0c;第一次登陆之后正常的网站都会赋予一个cookie 写写一个后台界面&#xff0c;直接让ai去写就可以 然后自己需要的提交方式&#xff0c;和表单值自己修改即可 生成cookie的…

(面试经典问题之连接池篇)连接池构成、作用及其基本原理详解

一、什么是连接池 连接池一般指的是数据库连接池&#xff08;connection pooling&#xff09;&#xff0c;是指程序启动时建立足够的数据库连接&#xff0c;并将这些连接组成一个连接池&#xff0c;由程序动态的对池中的连接进行申请&#xff0c;使用&#xff0c;释放&#xf…

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今社会&#xff0c;随着人们生活水平的不断提高和健康意识的日益增强&#xff0c;健…

echarts找不到了?echarts社区最新地址

前言&#xff1a;在之前使用echarts的时候&#xff0c;还可以通过上边的导航栏找到echarts社区&#xff0c;但是如今的echarts变更之后&#xff0c;就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind&#xff1a;凭证类型 Username with password&#xff1a; 配置 用…

【Nacos】从零开始启动Nacos服务(windows/linux)

文章目录 前言前置条件官方网址一、Nacos下载1.1 选择Nacos版本1.2 下载 二、解压2.1 解压到某个文件夹 三、 启动3.1 方式一&#xff1a;直接使用命令启动3.1.1 进入bin文件夹3.1.2 进入命令行工具3.1.3 执行命令 3.2 方式二&#xff1a;修改配置文件后启动3.2.1 修改启动脚本…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现&#xff0c;copilot会自动整理过去30天内所有用户使用copilot的概况&#xff1a; 直接把这个图丢给copilot让它去分析&#xff0c;结果如下&#xff1a; 总用户情况 总用户数在各应用中均为 561 人&#xff0c;说明此次统计的样本…

AI学习第一天-什么是AI

AI的发展可以被分为四次浪潮&#xff0c;这包括符号主义、机器学习与神经网络&#xff0c;以及深度学习。在这些发展中&#xff0c;深度学习凭借其在处理非结构化复杂数据、强大的学习能力和可解释性方面的优势备受关注。深度学习技术的应用不仅提升了AI系统的性能&#xff0c;…

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…