
一、错排问题的定义:什么是'完全错位'?
1.1 严格定义
错排问题的正式描述是:有 n 个不同的元素(如编号 1~n 的信、书、奖券),将它们重新排列,使得每个元素都不在原来的位置上,这样的排列称为'错排'(Derangement),求这样的排列一共有多少种?
我们用 Dₙ表示 n 个元素的错排数,例如:
- 当 n=1 时:只有 1 个元素,无法错位,D₁=0;
- 当 n=2 时:两个元素交换位置,只有 1 种错排,D₂=1;
- 当 n=3 时:元素 1、2、3 的错排为(2,3,1)和(3,1,2),共 2 种,D₃=2;
- 当 n=4 时:错排数为 9 种,D₄=9;
- 当 n=5 时:错排数为 44 种,D₅=44。
1.2 错排序列的规律
随着 n 的增大,错排数 Dₙ的增长速度非常快,形成了独特的错排序列:
| n(元素个数) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| Dₙ(错排数) | 0 | 1 | 2 | 9 | 44 | 265 | 1854 | 14833 | 133496 | 1334961 |
这个序列看似无规律,但背后隐藏着严谨的数学递推关系,这也是我们解决错排问题的核心。
二、错排公式的推导:从'递推'到'通项',两种思路吃透本质
2.1 递推公式:最易理解的核心逻辑
错排问题的递推公式是解决编程问题的关键,我们通过'分步讨论'的方式推导:
假设我们有 n 个元素(编号 1~n),现在要将它们全部错排,考虑元素 1 的放置位置:
**第一步:**将元素 1 放到除了位置 1 之外的任意一个位置,共有(n-1)种选择(比如放到位置 i,2≤i≤n); **第二步:**处理位置 i 上的原元素(编号 i),此时有两种情况: 情况 1:将元素 i 放到位置 1。此时,元素 1 和元素 i 完成了'交换',剩下的(n-2)个元素(2
i-1、i+1n)需要进行错排,错排数为 Dₙ₋₂; 情况 2:不将元素 i 放到位置 1。此时,元素 i 不能放到位置 1 和位置 i,而其他元素(2i-1、i+1n)也不能放到各自的原位置 —— 这相当于把位置 1 看作元素 i 的'新原位置',剩下的(n-1)个元素(2~n)需要进行错排,错排数为 Dₙ₋₁。
由于第一步有(n-1)种选择,且两种情况是互斥的,因此总的错排数为:Dₙ = (n-1) × (Dₙ₋₁ + Dₙ₋₂)
这就是错排问题的核心递推公式!有了这个公式,我们可以从 D₁=0、D₂=1 出发,递推出任意 n 的错排数。
2.2 通项公式:数学视角的精准表达
除了递推公式,错排问题还有通项公式,可通过容斥原理推导得出:Dₙ = n! × (1 - 1/1! + 1/2! - 1/3! + ... + (-1)ⁿ/n!)
这个公式的意义是:n 个元素的全排列数(n!)减去至少 1 个元素在原位的排列数,加上至少 2 个元素在原位的排列数,减去至少 3 个元素在原位的排列数……以此类推(容斥原理的核心思想)。
虽然通项公式看起来更'高级',但在编程实践中,递推公式更实用(尤其是 n 较大时,通项公式的计算容易出现精度问题,而递推公式可通过取模避免)。





