计算组合数python实现

组合数

1.阶乘的写法

C n m = A n m A m m = n ! ( n − m ) ! ∗ 1 m ! C_n^m=\frac{A_n^m}{A_m^m}=\frac{n!}{(n-m)!}*\frac{1}{m!} Cnm=AmmAnm=(nm)!n!m!1

# import math
# math.factorial() ,math里也自带了阶乘函数
def factorial(n):
    res = 1
    for i in range(2, n + 1):
        res = res * i
    return res
def Combinatorial(n, m):
    return factorial(n)//(factorial(m)*factorial(n-m))

2.直接实现

C n m = n ( n − 1 ) . . . ( n − m + 1 ) m ( m − 1 ) . . . 1 C_n^m=\frac{n(n-1)...(n-m+1)}{m(m-1)...1} Cnm=m(m1)...1n(n1)...(nm+1)

def Combinatorial(n, m):
    Min = min(m,n-m)
    res = 1
    for i in range(0, Min):
        res = res * (n-i) / (Min-i)
    return  res

3.利用组合恒等式递归

组合恒等式:
C n m = C n n − m = C n − 1 m − 1 + C n − 1 m C_n^m=C_n^{n-m}=C_{n-1}^{m-1}+C_{n-1}^m Cnm=Cnnm=Cn1m1+Cn1m
个人觉得这个恒等式可以理解成,n个里选m个等于以下两种情况的和:(1).选第一个,后面n-1个里选m-1个;(2).不选第一个,后面n-1个里选m个;

def Combinatorial(n,m):
    if m == n:
        return 1
    elif m == 0:
        return 1
    return Combinatorial(n-1, m-1) + Combinatorial(n-1, m)

4.还可以用快速幂求

略…想起来再补

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值