错位排列问题

该问题的变形如下:

例如有{ n}封写好了的信,收件人不同,胡乱放入{ n}个写了地址的信封中,寄出,求没有一个收件人收到他所应接收的信的概率。

问题解决


首先考虑几种简单的情况:

原序列长度为1 
序列中只有一个元素,位置也只有一个,这个元素不可能放在别的位置上,因此原序列长度为1时该为题的解是0。
原序列长度为2 
设原序列为{a,b},则全错位排列只需将两个元素对调位置{b,a},同时也只有这一种可能,因此原序列长度为2时该问题的解是1。
原序列长度为3 
设原序列为{a,b,c},则其全错位排列有:{b,c,a},{c,a,b},解是2。
原序列长度为4 
设原序列为{a,b,c,d},则其全错位排列有:{d,c,a,b},{b,d,a,c},{b,c,d,a},{d,a,b,c},{c,d,b,a},{c,a,d,b},{d,c,b,a},{c,d,a,b},{b,a,d,c},解是9。关概率为9/24 = 37.5%

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
'''
错位排列
'''
def wrongPos(n):
    if n==1:
        return 0
    if n== 2:
        return 1
    return (n-1)*(wrongPos(n-2)+wrongPos(n-1))

if __name__ == '__main__':
    for i in range(1,100):
        print(i,'的错位排序数为:',wrongPos(i))

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值