python递归排列组合_Python 排列组合

本文介绍了Python中计算排列组合的方法,包括阶乘、无重复有序排列、无序不重复组合的计算函数。通过递归函数实现阶乘,并应用到生日问题和大乐透概率的计算中,展示了如何用Python解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.排列&组合

有n个小球从中抽取m个,问有序抽取并且有重复的抽取个数为多少?

math?formula=n%5Em

有n个小球从中抽取m个,问有序抽取并且无重复的抽取个数为多少?

排列:

math?formula=A(n%2Cm)

有n个小球从中抽取m个,问无序抽取并且无重复的抽取个数为多少?

组合:

math?formula=C(n%2Cm)

有n个小球从中抽取m个,问无序抽取并且有重复的抽取个数为多少?

math?formula=C(m%2Bn-1%2C%20m)

以上四种情况均为最常见的排列组合,从有无顺序和是否重复两个维度进行思考,建议理解并背诵。

2.使用Python表示排列组合

在使用python计算排列组合之前,需要计算阶乘,可以有两种方式,一是使用math库中的factorial函数,二是使用如下的递归函数。

def factorial(n):

"""

计算阶乘

:param n: data

:return:

"""

if n == 1:

return 1

else:

return n * factorial(n-1)

按照排列的公式:

def my_permutation(n, k):

"""

计算无重复有序的排列数

:param n: 样本

:param k: 抽取

:return: 排列数

"""

return factorial(n)//factorial(n-k)

按照组合的公式:

def my_combination(n, k):

"""

计算无序且不重复的组合数

:param n: 样本

:param k: 抽取

:return: 组合数

"""

return factorial(n)//(factorial(n-k)*factorial(k))

3.例题

3.1 生日问题

假设一个班级中共有n个人,一年有365天,其中每天作为生日的概率是相等的,那么其中至少有两个人的生日在同一天的概率是多少?

此题属于全排列问题,需要反向思考,写出公式之后直接输入到python中计算

def birth(n):

"""

计算至少有两人的生日在同一天的概率

:param n: 班级人数

:return: 概率

"""

return 1 - factorial(365)/(factorial(365-n)*365**n)

# prob = birth(50)

# print("{:.2f}%".format(prob*100))

3.2 大乐透问题

大乐透的玩法是这样的,从35个红球中选择5个,从12个红球中选择2个,如果全中,那就中一等奖。那么请问,中一等奖的概率是多少?

此题属于组合问题,中奖的可能性为一种,因此分子为1,分母为所有的组合情况。

def prize():

return 1/(my_combination(35, 12) * my_combination(12, 2))

prob = prize()

print("{:.15f}%".format(prob%100))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值