錯排的遞推公式及推導

2021-07-26 13:28:34 字數 1452 閱讀 2754

f(n)=(n-1)*(f(n-2)+f(n-1));

顏書先生《「裝錯信封問題」的數學模型與求解》一文(見《數學通報》 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 )

ps: hdoj-1645

#include#include#include#includeusing namespace std;  

int n,i;  

long long s[27];  

int main()  

{   

s[0]=0; s[1]=0; s[2]=1;  

for (i=3;i<=20;i++)  

s[i]=(i-1)*(s[i-1]+s[i-2]);       

while (cin>>n)   

cout<

錯排的遞推公式及推導

嘻嘻 剛用電腦的photoshop做出來 f n n 1 f n 2 f n 1 顏書先生 裝錯信封問題 的數學模型與求解 一文 見 數學通報 2000 年第 6 期 p.35 給出了該經典問題的乙個模型和求解公式 編號為 1 2 n 的 n 個元素排成一列,若每個元素所處位置的序號都與它的編號不同...

錯排的遞推公式及推導

錯排遞推公式 f n n 1 f n 2 f n 1 顏書先生 裝錯信封問題 的數學模型與求解 一文 見 數學通報 2000 年第 6 期 p.35 給出了該經典問題的乙個模型和求解公式 編號為 1 2 n 的 n 個元素排成一列,若每個元素所處位置的序號都與它的編號不同,則稱這個排列為 n 個不同...

錯排公式的推導及應用

同時發布在我的個人部落格 以下是原文 考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排,n個元素的錯排記為d n 下面就是求出d n 為多少中排列。首先我們拿第乙個元素的放置來理解一下這個過程 把元素1放在除自己原來的位置以外的位置,共有 ...