大家今天想跟大家唠唠我最近折腾的一个小玩意儿——排列组合计算器。也不是啥大事儿,就是平时偶尔会碰到需要算算排列数、组合数的情况,老是手动算或者到处找在线工具,感觉有点麻烦,所以就想着自己动手搞一个简单的。
为啥要搞这个?
起因挺简单的。有时候看点资料,或者帮小孩看看数学题,偶尔就会遇到“从n个里面选r个,有多少种排法/组合”这类问题。用笔算,数字小还行,稍微大一点,那个阶乘算起来就头大。上网找工具,也行,但有时候网不或者找到的工具广告一堆,用着不爽。我就寻思,这玩意儿原理也不复杂,干脆自己写个小程序,随用随开,方便。
开始动手
第一步:理清思路
我先得把排列(Permutation)和组合(Combination)这两个概念弄明白。简单说:
- 排列:要讲顺序。比如3个人里选2个人排队,AB和BA算两种。
- 组合:不讲顺序。比如3个人里选2个人组队,选了A和B,就是这俩人,没顺序的事儿。
对应的公式也得找对:
- 排列 P(n, r) = n! / (n-r)!
- 组合 C(n, r) = n! / (r! (n-r)!)
核心就是那个阶乘(factorial),就是 n! = n (n-1) ... 1。这个得先搞定。
第二步:选择工具
我想着就做个简单的命令行小工具,不用搞啥花哨的界面。用啥语言?Python好像挺顺手的,处理数字也方便。那就它了。
第三步:写代码
打开编辑器,先写了个计算阶乘的函数。这个简单,用个循环或者递归都行。我选了循环,感觉直观点。

# 大概是这个意思,伪代码哈
function factorial(num):
if num < 0:
return "输入不能是负数"
if num == 0:
return 1

result = 1
for i from 1 to num:
result = result i
return result
然后,基于这个阶乘函数,再写计算排列数和组合数的函数。
# 排列
function permutation(n, r):
if r < 0 or r > n:
return "r值不合法"
return factorial(n) / factorial(n-r)

# 组合
function combination(n, r):
if r < 0 or r > n:
return "r值不合法"
# 这里稍微优化下,避免分子分母太大导致中间结果溢出或精度问题
# C(n, r) = P(n, r) / r!

# 实际写的时候要注意处理大数,不过我先简单实现
return factorial(n) / (factorial(r) factorial(n-r))
第四步:加上交互
光有函数不行,得让用户能输入n和r。我就加了点代码,让程序能提示用户输入,然后读取输入,调用上面的函数,把结果打印出来。顺便加了点简单的输入检查,比如输入的得是数字,n要大于等于r之类的。
测试和完善
写完后,我就自己试了几个例子。比如 P(5, 2) 应该是 5! / (5-2)! = 120 / 6 = 20。C(5, 2) 应该是 5! / (2! (5-2)!) = 120 / (2 6) = 10。跑了下程序,结果对得上,心里就有底了。
我这个是很初级的版本。没考虑输入的数字超级大的情况,那时候阶乘会爆掉。也没做图形界面。但对我自己偶尔用一下,足够了。
总结一下
整个过程下来,挺快的。从有想法,到查资料,写代码,测试,前后也就个把小时。虽然是个不起眼的小工具,但自己动手做出来,用着就是顺手。而且也算是复习了一下排列组合的知识,顺便练了练手。以后再遇到需要算这个的,直接打开我自己的小程序就行,不用再费劲找了。这种解决自己实际小痛点的过程,还是挺有意思的。