终极目标:快速找出一个大数的排列组合结果个数
以下是我目前做到的程度
第一行下方的数字表示该数选1-9的结果个数
规律 n选0=1
n选1=n
n选n=1
n选(n-1)=n
n选x=(n-1)选x+(n-1)选(x-1)
n选x=(n-1)选(x-1)+(n-2)选(x-1)+…+(x-1)选(x-1)
n选0到n选n=2^n
对称性 n为奇数时: 2^n/2= n选0到n选 intergerdivid(n,2)
n为偶数时:(2^n-n选(n/2))/2=n选0到n选n/2-1 也等于n选(n/2+1)到n选n
已知:n选0=1,n选1=n,n选n=1
理论上来说,根据n选x=(n-1)选x+(n-1)选(x-1),知道了2选1,2选2,就知道了3选1到3选3,进而就知道了4选1到4选4,也就知道了n选1到n选n。
反过来推也是可以的,n选x=(n-1)选x+(n-1)选(x-1) ,是一个巨大的树状结构,一分2,2分4,4分8.。。
至于为什么n选0到n选n 结果为2^n次方,可以举个例子
如,有7个瓶子,只有一个瓶子里有毒药,现在只有3只小白鼠,如何用这3只老鼠去检验出毒药瓶子?
对于不了解2进制的人来说,肯定是先一个个去凑,每只老鼠单独喝几瓶,经过各种排列组合得到结果,当然,如果只是停留在傻傻的排列组合阶段,是很难凑出结果的,多看几遍题目会发现, 原来就是求 3只老鼠有多少种死法,一种死法对应一个瓶子,多少种死法就能排查多少个瓶子, 那3的排列组合最大数就是 3选1+3选2+3选3=7,刚好7个瓶子一一对应,最终肯定能找到哪个瓶子是毒药。 如果是2进制的解法直接2的3次方=8,8大于7所以3只老鼠就够用。
瓶子 老鼠1 老鼠2 老鼠3
1 1 0 0
2 0 1 0
3 0 0 1
4 1 1 0
5 1 0 1
6 0 1 1
7 1 1 1
0 0 0
我的问题是, 如何将这些规律性的东西写成一个迭代公式?或者循环递归之类的?从而达到无论多大的数 都可以根据这个迭代求排列组合数的结果, 而不需要用 acc+transformmany 去算具体过程,因为数量太多 计算时长长且几亿个结果也无法导出。