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个数也是从正确的位置换出去,所以仍然是一个错排。