python 实现 Cmn 的排序 阶乘 排列 组合

阶乘的实现

n! = 54321
方法一:普通的的循环:

a = 1
n = 5
for i in range(1, n + 1):
    a *= i

方法二:递归

def f(a):
    if a == 0 or a == 1:
        return 1
    return a * f(a - 1)
print(f(5))

排列组合

对于Cmn 上面是m阶乘n次,下面是n的阶乘
C 5 2 = 54 // 21

实现方式
方法一:普通的的循环

# 以C 5 2 为例
a = 2
n = 5

# sup是分子部分
sup = 1
for i in range(1, a + 1):
    sup *= i

# sub是分母部分,注意初始时都是1
#  但是乘的范围不同
sub = 1 
for i in range(n-a+1, n + 1):
    sub *= i

方法二:递归
我这个目前用的优点难使用,m是m,但是k不是n,k是一直阶乘到几,比如f(5,2)表示的是 5 * 4*3*2 并不是5向下乘k次,所以使用的时候有点麻烦,第二个参数是 m-a
最终的计算结果是两次递归结果相除

def f(m, k):
    if m == k:
        return 1
    return m * f(m - 1, k)
m = 5
a = 3
print(f(m, m-a)//f(a, 1)

总的来看,最好记的方案就是:

# 计算 C ba, b在下面a在上面
def cal_c(a, b):
    sub = 1
    for i in range(1, a+1):
        sub *= i
    sup = 1
    for i in range(b - a + 1, b + 1):
        sup *= i
    return sup // sub

Python自带的计算组合数的函数 comb

#  leetcode默认已经导入了,不需要import
from math import comb
#  comb(n,k), n就是下面哪个,k就是上面那个
print(comb(2, 1))

插一条脑子卡住了的排列组合题: 一共要走n步,其中必须像左走k步,也就是必须向右走n-k步,问一共有多少种走法?
这不就是一共了n个球,挑选k个球,一共有多少种挑选的方法吗,不就是简单的cnk吗,不就是comb(n,k)吗!淦! 你就想象,一共有n个向右的箭头,挑k个出来指向左边,不就是cnk中挑选的方式吗!!!

你可能感兴趣的:(算法相关,python,leetcode)