1. 程式人生 > >錯排的簡單理解

錯排的簡單理解

考慮一個有n個元素的排列,若一個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的一個錯排。

數學原理:組合數學

這裡只說對遞推公式的理解,D(n)=(n-1)*(D(n-1)+D(n-2));

當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用D(n)表示,那麼D(n-1)就表示n-1個編號元素放在n-1個編號位置.

例如:有abcde五個元素,分別對應12345五個位置,假設當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用D(5)表示,可以用組合數學思想一個一個元素的分析,首先在1位置放元素,除去a共有4個元素可供選擇,再來看2位置,這裡有兩種情況

(1):當1 位置放b元素時,其餘元素(即三個元素)的排列方法有D(5-2)種;

(2):當1位置不放b元素時,2位置有四種選擇,即其餘位置有D(4)種排列方法;

以此類推,D(n)=(N-1)*(D(n-1)+D(n-2));

顯然用遞迴寫這個演算法再好不過啦,其中可以把兩個特例D(1)=0,D(2)=1作為遞迴的終止條件;

參考程式碼:

#include<stdio.h>

int f(int n)
{
if(n==1)
return 0;
else if(n==2)
return 1;
else
return (n-1)*(f(n-1)+f(n-2));
}
int main()
{
int a;
while(scanf("%d",&a)==1)
{
printf("%d\n",f(a));
}
return 0;
}