🐍 Python 枚举算法教程(Brute Force / Enumeration)


🔍 什么是枚举算法?

枚举算法(Enumeration Algorithm) 是一种最基本的、最暴力的解决问题的方法。

它的思想很简单:“把所有可能的情况都列出来,一个一个试!”

虽然效率不高,但胜在 逻辑清晰、容易实现、适合初学者入门算法


⚙️ 枚举算法的核心思想

  1. 找出所有可能的候选解
  2. 逐一验证每个候选解是否满足条件
  3. 记录符合条件的解

类比生活中的找钥匙:

  • 钥匙丢了?那就一个个抽屉打开看
  • 虽然慢,但一定能找到

📦 枚举算法的通用结构(模板)

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 条评论

  • 1