- Python
Python 枚举算法
- 2025-5-17 21:30:42 @
🐍 Python 枚举算法教程(Brute Force / Enumeration)
🔍 什么是枚举算法?
枚举算法(Enumeration Algorithm) 是一种最基本的、最暴力的解决问题的方法。
它的思想很简单:“把所有可能的情况都列出来,一个一个试!”
虽然效率不高,但胜在 逻辑清晰、容易实现、适合初学者入门算法!
⚙️ 枚举算法的核心思想
- 找出所有可能的候选解
- 逐一验证每个候选解是否满足条件
- 记录符合条件的解
类比生活中的找钥匙:
- 钥匙丢了?那就一个个抽屉打开看
- 虽然慢,但一定能找到
📦 枚举算法的通用结构(模板)
for 每一个可能的情况:
if 满足条件:
保存结果
🎯 常见枚举问题类型 & 模板示例
✅ 1. 枚举整数范围内的解(简单题)
题目描述:
找出 1~100 中能被 3 整除的数。
🧩 示例代码:
result = []
for i in range(1, 101):
if i % 3 == 0:
result.append(i)
print(result)
✅ 解释:
- 枚举了 1 到 100 的每一个数字
- 用
i % 3 == 0
判断是否是3的倍数 - 把符合的加入列表中
✅ 2. 枚举数组中所有子集的和(组合型枚举)
题目描述:
给定一个整数数组 nums,枚举它的所有非空子集,并输出它们的和。
🧩 示例代码:
from itertools import combinations
nums = [1, 2, 3]
for length in range(1, len(nums) + 1): # 枚举不同长度
for subset in combinations(nums, length): # 枚举每个组合
print(f"子集 {subset},和为 {sum(subset)}")
✅ 解释:
- 使用
itertools.combinations()
来生成所有组合 - 枚举每个组合的长度
- 计算并打印每个子集的和
✅ 3. 枚举字符串的所有排列(Permutation)
题目描述:
给定一个字符串,如 "abc"
,枚举它所有的排列组合。
🧩 示例代码:
from itertools import permutations
s = "abc"
for p in permutations(s): # 枚举所有排列
print("".join(p)) # 把字符元组转成字符串
✅ 解释:
- 使用
permutations()
枚举所有排列 - 每个排列是一个字符的元组
- 用
join()
转换为字符串输出
✅ 4. 枚举两个数组的笛卡尔积(Cartesian Product)
题目描述:
给定两个数组 A 和 B,求出它们的笛卡尔积(即 A×B)。
🧩 示例代码:
import itertools
A = [1, 2]
B = ['a', 'b']
for pair in itertools.product(A, B): # 枚举所有配对
print(pair)
✅ 输出:
(1, 'a')
(1, 'b')
(2, 'a')
(2, 'b')
✅ 5. 枚举所有可能密码(暴力破解演示)
题目描述:
尝试枚举所有 3 位纯数字密码(000~999),用于演示暴力破解。
🧩 示例代码:
for i in range(1000): # 枚举 0~999
password = f"{i:03d}" # 格式化为三位数,如 007
print("尝试密码:", password)
✅ 解释:
- 使用格式化
{i:03d}
补零 - 枚举所有三位数的可能性
- 可扩展到字母+数字混合等更复杂场景
🧰 枚举算法小技巧总结
技巧 | 说明 |
---|---|
🔄 循环嵌套 | 多重循环可以枚举多个变量的组合 |
📦 itertools | 使用标准库快速枚举组合、排列、乘积 |
🧹 剪枝优化 | 如果某些情况不可能满足条件,提前跳过(提高效率) |
🧠 状态判断 | 在每次枚举后判断是否符合条件 |
🧪 练习建议
你可以试着挑战以下问题:
- [ ] 找出所有两位数中的质数
- [ ] 枚举所有 a+b+c=1000 的正整数解
- [ ] 枚举所有三位数的水仙花数
- [ ] 枚举所有可能的日期组合(年月日合法)
📚 推荐学习路线图
枚举入门 👉 枚举数组组合 👉 枚举排列 👉 枚举密码空间 👉 枚举+剪枝优化
🙋♂️ 如何继续学习?
如果你希望我继续扩展以下内容,请告诉我:
- 如何结合枚举和剪枝优化?
- 如何用类封装枚举函数?
- 如何处理更复杂的枚举条件?
- 如何画出枚举过程帮助理解?
😊
📌 结语:
枚举算法是算法学习的第一步,虽然看似“笨”,但它可以帮助你建立清晰的编程思维。多写几个例子,你就能体会到它的实用之处!
需要配套练习题或进阶讲解也可以随时告诉我哦 😊
3 条评论
-
admin SU @ 2025-6-1 10:36:07
-
2025-6-1 10:35:11@
-
2025-6-1 10:34:35@
- 1