【组合数学】错排问题 ( 递推公式 | 通项公式 | 推导过程 ) ★

【组合数学】错排问题 ( 递推公式 | 通项公式 | 推导过程 ) ★一 错排问题 二 错排问题递推公式推导 三 推导错排公式

一、错排问题


n n n 封不同的信 与 n n n 个不同的信封 , 将 n n n 封信都装错信封的方案个数 ;

错排 ( Derangement ) , 因此错排公式中使用 D ( n ) D(n) D(n) 表示 n n n 个元素的错排 ;

假如有 1 1 1 封信 , n = 1 n= 1 n=1 , 此时不能错排 , D ( 1 ) = 0 D(1) = 0 D(1)=0 ;

假如有 2 2 2 封信 , n = 2 n= 2 n=2 , 此时交换一下即可完成错排, 有 1 1 1 种方案 , D ( 2 ) = 1 D(2) = 1 D(2)=1 ;

在这里插入图片描述

假如有 3 3 3 封信 , 1 , 2 , 3 1,2,3 1,2,3 三封信与三个信封 ,

  • 如果 1 1 1 放到 3 3 3 信封中 , 此时将 2 2 2 放到 1 1 1 信封中 , 将 3 3 3 放到 2 2 2 信封中 ,
    1 , 2 , 3 1,2,3 1,2,3
    3 , 1 , 2 3,1,2 3,1,2

  • 如果 1 1 1 放到 2 2 2 信封中 , 此时将 2 2 2 放到 3 3 3 信封中 , 将 3 3 3 放到 1 1 1 信封中 ,
    1 , 2 , 3 1,2,3 1,2,3
    2 , 3 , 1 2,3,1 2,3,1

  • D ( 3 ) = 2 D(3) = 2 D(3)=2

如果有 4 4 4 封信 , 此时就不好计算 , 9 9 9 种方法 , D ( 4 ) = 9 D(4) = 9 D(4)=9

如果有 5 5 5 封信 ⋯ \cdots , D ( 5 ) = 44 D(5) = 44 D(5)=44

⋮ \vdots

如果有 n n n 封信 ⋯ \cdots , D ( n ) = n ! ( ( − 1 ) 0 0 ! + ( − 1 ) 1 1 ! + ( − 1 ) 2 2 ! + ( − 1 ) 3 3 ! + ⋯ + ( − 1 ) n n ! ) = n ! ∑ k = 0 n ( − 1 ) k k ! D(n) = n! ( \cfrac{(-1)^0}{0!} + \cfrac{(-1)^1}{1!} + \cfrac{(-1)^2}{2!} + \cfrac{(-1)^3}{3!} + \cdots + \cfrac{(-1)^n}{n!} ) = n! \sum\limits_{k=0}^{n}\cfrac{(-1)^k}{k!} D(n)=n!(0!(1)0+1!(1)1+2!(1)2+3!(1)3++n!(1)n)=n!k=0nk!(1)k

二、错排问题递推公式推导


观察上述规律 , 推导出递推公式 ;

假如有 n n n 封信 , 任何一封信都需要错位 , 错排方案数是 D ( n ) D(n) D(n) ;

1 . 分步计数原理 : 使用 分步计数原理 , 先统计 第一封信的排列方法 , 然后再讨论 其余信的排列方法数 ;

( 1 ) 第一步 : 首先找出一封信 a a a 出来 , 这封信不能排在其本身位置 , 只能放在其余 n − 1 n-1 n1 个位置上 , 因此有 n − 1 n-1 n1 种排法 ;

( 2 ) 第二步 : 现在讨论其余除 a a a 之外的其余信的位置的错排问题 ;

2 . 分类计数原理

假设第一封信 a a a 占据了 b b b 的位置 , 那么此时 b b b 放在哪个信封分两种情况 , b b b 放在 a a a 位置 , b b b 不放在 a a a 位置 ;

( 1 ) 第一类 : 第一种情况是放在 a a a 位置 , 此时 b b b 放在 a a a 位置 , 剩下 n − 2 n-2 n2 封信进行错排 , 方案数是 D ( n − 2 ) D(n-2) D(n2)

( 2 ) 第二类 : 第二种情况是 b b b 没有去 a a a 的位置 , 那么 b b b 可能出现在除 a a a 之外的任何位置 , b b b n − 2 n-2 n2 个位置可以去 , 不能去 a , b a,b a,b 位置 , 其余所有元素都有 n − 2 n-2 n2 个位置可以去 ( a , b a,b a,b 位置不能去 ) , 这种情况下 相当于除 a a a 之外的其它元素的错排问题 , 即 n − 1 n-1 n1 个元素的错排问题 , 方案数是 D ( n − 1 ) D(n-1) D(n1) ; ★ ( 核心推导逻辑 ) ★

( 3 ) 加法法则 : 汇总上述分类计数原理 , 使用 加法法则 , 计算结果是 D ( n − 1 ) + D ( n − 2 ) D(n -1) + D(n-2) D(n1)+D(n2)

3 . 乘法法则 : 汇总上述分步计数原理 , 使用 乘法法则 , 计算结果是

D ( n ) = ( n − 1 ) ( D ( n − 1 ) + D ( n − 2 ) ) D(n) = (n-1) (D(n -1) + D(n-2)) D(n)=(n1)(D(n1)+D(n2))

三、推导错排公式


递推公式 : D ( n ) = ( n − 1 ) ( D ( n − 1 ) + D ( n − 2 ) ) D(n) = (n-1) (D(n -1) + D(n-2)) D(n)=(n1)(D(n1)+D(n2))

初值 : D ( 1 ) = 0 , D ( 2 ) = 1 D(1) = 0 , D(2) = 1 D(1)=0,D(2)=1

使用 递推方程 , 生成函数求解递推方程 , 容斥原理 , 可以推导出如下公式 :

D ( n ) = n ! ( ( − 1 ) 0 0 ! + ( − 1 ) 1 1 ! + ( − 1 ) 2 2 ! + ( − 1 ) 3 3 ! + ⋯ + ( − 1 ) n n ! ) = n ! ∑ k = 0 n ( − 1 ) k k ! D(n) = n! ( \cfrac{(-1)^0}{0!} + \cfrac{(-1)^1}{1!} + \cfrac{(-1)^2}{2!} + \cfrac{(-1)^3}{3!} + \cdots + \cfrac{(-1)^n}{n!} ) = n! \sum\limits_{k=0}^{n}\cfrac{(-1)^k}{k!} D(n)=n!(0!(1)0+1!(1)1+2!(1)2+3!(1)3++n!(1)n)=n!k=0nk!(1)k

参考 :

  • 百度百科-错排公式
  • 【组合数学】递推方程 ( 递推方程求解过程总结 | 齐次 | 重根 | 非齐次 | 特征根为 1 | 指数形式 | 底为特征根的指数形式 ) ★★
  • 【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )
  • 【集合论】容斥原理 ( 包含排斥原理 | 示例 )






























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226145.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午7:43
下一篇 2026年3月17日 上午7:44


相关推荐

  • 华为模拟器ensp命令_vmware命令大全

    华为模拟器ensp命令_vmware命令大全命令符从用户视图切换到系统视图system–view从系统视图切换到用户视图quit连入接口命令interfaceIP地址、子网掩码配置命令ipaddress接口IP信息查看命令displayipinterfacebriefIPv4路由表信息查询命令displayiprouting–table配置完成退回视图界面命令return命令自动补全快捷键【Tab】…

    2025年6月27日
    3
  • Js中设置css样式

    Js中设置css样式本次介绍了 3 种修改 css 样式的方法 下面分别介绍 css 代码 style div width 100px height 100px background color pink style background color red style js 代码

    2026年3月19日
    1
  • win10下CUDA10 CUDNN的安装

    win10下CUDA10 CUDNN的安装

    2021年3月12日
    140
  • @helper的使用

    @helper的使用、前言最近翻到一篇Scott的旧文,觉得挺不错的,就试着翻译了一下,文章主要是说如何在Razor中使用@helper语法定义可复用的视图模板方法。如有疏漏,还请请各位看官指点一二~原文地址:http:

    2022年7月3日
    35
  • pycharm查看python版本-pycharm如何设置python版本

    pycharm查看python版本-pycharm如何设置python版本直接上图 mac 环境 一 设置项目的 python 版本 File DefaultSetti 在弹出的界面上 参考下图 左上角的下拉框里 选择 python 解释器的版本即可 建议 直接安装 anaconda 这个已经集成了很多第三方的类库 二 添加第三方类库仍然在上图中 下面有一个 号按钮 点击进入下图 直接在搜索框里 搜索需要的第三方类库即可 以 tensorflow 为例 找到后点击

    2026年3月27日
    2
  • 关于FEC驱动_FEC伍丰

    关于FEC驱动_FEC伍丰转载说是网络,其实是网卡驱动。而且是针对于FREESCALE芯片的FEC端的驱动,我不知道别的芯片厂商的FEC模块是怎么样的,但就我接触过的几款FREESCALE的芯片来看,比如基于POWERPC的860T和ARM系列的MX27等,他们的FEC有一个明显的特点就是都是由BD和一个DMA缓冲组成,而这个DMA是专用的,也就是只是给FEC使用,区别于芯片内的DMAC模块。我们先来从fec.c这个与

    2022年8月11日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号