错排计数问题

1-N的自然数有n!个全排列,如果一个排列使得所有元素都不在应在的位置上,则称之为错排。对任意的n,求出n个元素的错排有多少种,并编程输出这些错排。

 

首先来看计数: 设n个数的错排为Sn;

1. 首先放第一个数A1,因为这个数不能放在正确的位置上,所以有 n-1 个位置可以放,假设放的这个位置为Ak应当在的位置;

2.现在我们还有n-1个数,由于第一个数A1占据了Ak的位置,现在我们来放Ak, 假设Ak放在A1的位置上,那么即这两个数相互交换了位置,现在剩余的n-2个数变成了原来的问题,即Sn-2;

3.假设Ak没有放在A1的位置上,加上这个数的n-1个数(除了已经放好的A1),也变成一个原来的问题,即Sn-1,因为在剩余的n-1个位置中,Ak不能放在其中一个位置上,这不跟原来的问题就是一样的吗。

4.所以递推式为  Sn = (n-1)(Sn-1+Sn-2); S1=0, S2=1

发现这个其实跟金刚坐飞机问题是一样的。

 

然后来看排列:

如果我们已经有了n-1个数的错排,那么加入第n个数的错排其实就是将 1~n-1位置的数与第n个数交换,可知前n-1个数换到第n个位置必不是正确的位置,而第n个数也是从正确的位置换出去,所以仍然是一个错排。

 

你可能感兴趣的:(错排计数问题)