组合数递推公式的推导

  突然想到可以从集合的角度来推导组合数的递推公式,特意记下来。

Cnm=Cn1m1+Cn1m

  可以把Cnm理解为从n个元素中选取m个元素所组成的集合的数量,也就是说这些集合中的元素个数恰好都为m个,并且这m个元素都是从n个元素中选出来的,而这样的集合的个数就为Cnm个。

  显然,对于包含m个元素的这些集合中,对于某个元素x,这些集合中要么包含x,要么不包含x。因此我们可以把这些集合划分成两类,一类是包含x的集合,另一类是不包含x的集合,这样一定可以把这Cnm个集合不重不漏地划分为两类。我们分别算一下在这两类中,每一类中含有的集合个数是多少,最后把这两类的分别含有的集合个数加起来,就可以得到Cnm这个值。

  下面我们来分别计算这两类中各自含有的集合的个数。

  1. 首先是包含元素x的一类:

  每个集合中包含的元素个数都为m,且必定包含元素x。由于是组合,不考虑顺序,我们统一把x放在最后一个位置。

  我们来把被划分到这类的集合表现出来,其中o代表任意一个元素,并且不存在为x的元素。

  现在要求的是有多少个这样的集合。由于每一个集合的最后一个元素为x,我们可以把每个集合中的x去除,这种做法并不影响这些集合的个数。

  现在问题就等价于,只考虑由前m1个元素构成的集合的个数有多少个。

  由于这些集合中的前m1个元素都不为x,我们可以把xn个元素中去除,变成了n1个元素。

  要知道组成这m1个元素的集合的个数有多少个,就等价于从n1个元素里面选出m1个元素的方案数,也就是Cn1m1

  所以这一类所包含的集合的个数为Cn1m1

  2. 然后是不包含元素x的一类:

  每个集合中包含的元素个数都为m,且必定不包含元素x。其中o代表任意一个元素,并且不存在为x的元素。

  现在要求的是有多少个这样的集合。由于每一个集合都不包含元素x,因此我们可以先把xn个元素中去除,变成n1个元素,现在这n1个元素中是没有x的了。

  等价于要知道从这n1个元素里面选m个元素的方案数,也就是Cn1m

  所以这一类所包含的集合的个数为Cn1m

  最后就是把这两类的各自含有集合的个数加起来,就得到从个n元素中选取m个元素的集合的数量,即Cnm=Cn1m1+Cn1m

posted @   onlyblues  阅读(2189)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示