`

错排问题的递推解决

阅读更多

http://blog.programfan.com/article.asp?id=17413

也谈“装错信封问题”

广东省江门一中 王 旭( 529000 )

颜书先生《“装错信封问题”的数学模型与求解》一文(见《数学通报》 2000 年第 6 期
p.35 ),给出了该经典问题的一个模型和求解公式:

编号为 1 , 2 ,……, n 的 n
个元素排成一列,若每个元素所处位置的序号都与它的编号不同,则称这个排列为 n
个不同元素的一个错排。记 n 个不同元素的错排总数为 f(n) ,则

f(n) = n![1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!]( 1 )

本文从另一角度对这个问题进行一点讨论。

1. 一个简单的递推公式

n 个不同元素的一个错排可由下述两个步骤完成:

第一步,“错排” 1 号元素(将 1 号元素排在第 2 至第 n 个位置之一),有 n - 1
种方法。

第二步,“错排”其余 n - 1 个元素,按如下顺序进行。视第一步的结果,若 1
号元素落在第 k 个位置,第二步就先把 k 号元素“错排”好, k
号元素的不同排法将导致两类不同的情况发生:( 1 ) k 号元素排在第 1
个位置,留下的 n - 2 个元素在与它们的编号集相等的位置集上“错排”,有 f(n -2)
种方法;( 2 ) k 号元素不排第 1 个位置,这时可将第 1 个位置“看成”第 k
个位置,于是形成(包括 k 号元素在内的) n - 1 个元素的“错排”,有 f(n - 1)
种方法。据加法原理,完成第二步共有 f(n - 2)+f(n - 1) 种方法。

根据乘法原理, n 个不同元素的错排种数

f(n) = (n-1)[f(n-2)+f(n-1)] (n>2) 。 ( 2 )

-------------------------

下面通过这个递推关系推导通项公式:
为方便起见,设M(k)=k!N(k), (k=1,2,…,n)
则N(1)=0,N(2)=1/2
n>=3时,n!N(n)=(n-1)(n-1)!N(n-1)+(n-1)!N(n-2)
即 nN(n)=(n-1)N(n-1)+N(n-2)
于是有N(n)-N(n-1)=-[N(n-1)-N(n-2)]/n=(-1/n)[-1/(n-1)][-1/(n-2)]…(-1/3)[N(2)-N(1)]=(-1)^n/n!
因此
N(n-1)-N(n-2)=(-1)^(n-1)/(n-1)!
N(2)-N(1)=(-1)^2/2!
相加,可得
N(n)=(-1)^2/2!+…+(-1)^(n-1)/(n-1)!+(-1)^n/n!
因此
M(n)=n![(-1)^2/2!+…+(-1)^(n-1)/(n-1)!+(-1)^n/n!]
可以得到
错排公式为M(n)=n!(1/2!-1/3!+…..+(-1)^n/n!)
此外也可以用容斥原理证明:
正整数1、2、3、……、n的全排列有n!种,其中第k位是k的排列有(n-1)!,当k取1、2、3、……、n时,共有n*(n-1)!种排列,由于是错排,这些排列应排除,但是此时把同时有两个以上的数不错排的排列多排除了一次,应补上;在补上时,把同时有三个以上的数不错排的排列多补上了一次,应排除;……;继续这一过程,得到错排的排列种数为
M(n)=n!-n!/1!+n!/2!-n!/3!+…+(-1)^n*n!/n!=sigma(k=2~n) (-1)^k*n!/k!
即M(n)=n![1/0!-1/1!+1/2!-1/3!+1/4!+..+(-1)^n/n!]
注:sigma表示连加符号,(k=2~n)是连加的范围

另外:书上的错排公式为Dn=n!(1-1/2!+1/3!-.....+(-1)n/n!),此公式算n很大时就很不方便.后来发现它可以化简为1个优美的式子Dn=[n!/e+0.5],[x]为取整函数.
公式证明较简单.观察一般书上的公式,可以发现e-1的前项与之相同,然后作比较可得/Dn-n!e-1/<1/(n+1)<0.5,于是就得到这个简单而优美的公式(此仅供参考)

分享到:
评论

相关推荐

    背包问题的递推解决

    一种贪心法解决背包问题的方式,通过递推并节点分述查找最优解

    递推课件-ACM 程序设计

    如果把问题的规模缩小,得到的小问题与原问题在结构上性质上相同或相似,并且子问题与原问题关联紧密,子问题的解能够决定原问题的解,这时可以考虑该题可能属于递推问题。 二. 定义子问题:用一个函数把问题准确的...

    noip算法之递推算法讲义

    在有些问题中,相邻两项或多项数字(状态)之间存在某种关系,可能通过前一项或多...如果能找出问题的前后两项或前后多项的递推关系,利用循环控制,问题可以很好的得到解决,因此,建立递推关系式是解决递推问题的关键

    C语言递推算法汇总大作业

    中北大学我们组的C语言递推算法汇总大作业,压缩包里有.exe执行文件,该压缩文件包含了16个递推算法问题,每个问题有各自的界面,界面里有问题的描述、例子、算法说明等等,在界面中还具有 2 个可执行的选项:第一个...

    c++递归/递推经典题目

    这里是本蒟蒻整理/写的递归递推经典题目 上传供大家学习使用 包含:过河卒、过河卒升级版、汉诺塔、级数求和、勒让德多项式、流感传染、判断回文、判断元素是否存在、平方根级数、平面分割升级版、全排列递归版、...

    递推最小二乘法matlab程序

    递推最小二乘法matlab程序

    核电站问题「he」题解递推

    核电站问题「he」题解递推

    递推式的一般代数解法

    例如汉诺塔问题的时间复杂度递推 形式为 T (n)=2T (n−1)+1 (n≥1) ,可以解出封闭形式为 T (n)=2 n −1 (设初始状态 T (0)=0 )。 因为递推式求解的重要性,许多算法书籍对其有专门介绍。Donald Knuth在Concrete ...

    归纳策略之递推算法

    有一类试题,每相邻两项数之间的变化有一定的规律性,我们可将这种规律归纳成如下简捷的递推关系式:F(n)=G(F(n-1)) 这就在数的序列中,建立起后项和前项之间的关系。然后从初始条件(或最终结果)入手,一步步地按...

    bestspeculate.rar_matlab循环递推_最小二乘_最小二乘法_递推 MATLAB_递推 最小二乘法

    根据最小二乘法的递推公式 ,由 ,逐次递推可得。程序中选取矩阵来存放x的值。通过循环程序计算出 , , 的值

    递推最小二乘法(RLS)matlab源程序

    用matlab实现递推最小二乘法。 源代码。。

    递推最小二乘算法

    递推最小二乘算法递推最小二乘算法递推最小二乘算法递推最小二乘算法递推最小二乘算法递推最小二乘算法

    数学递推小结

    关于几种递推

    递推平均滤波与加权滤波_加权滤波_递推平均滤波_

    递推平均滤波与加权滤波示例c++程序,涉及方波,正弦波,等常见波形,附加噪

    利用数学“递推式”思维解决C语言教学循环问题.pdf

    利用数学“递推式”思维解决C语言教学循环问题.pdf

    MATLAB递推最小二乘算法

    rls算法,递推最小二乘法是最小二乘法中的一种快速算法。递推最小二乘(RLS)算法在迭代过程的每一步都能达到最佳迭代算法。RLS算法可以使输出信号在最小二乘意义上尽可能接近期望信号,因为它可以选择自适应滤波器...

    增加约束条件的线性规划问题递推算法研究

    首先描述线性规划问题中约束条件增加时的递推求解问题,此问题在线性规划问题中具有广泛的实际背景;然后提出一个基于凸空间思想的快速求解此类问题的递推算法,该算法能快速判断其矛盾约束、冗余约束以及新问题的...

    程序设计基础递推

    程序设计基础11_1_递推.ppt c语言

Global site tag (gtag.js) - Google Analytics