阶乘的实现
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中挑选的方式吗!!!