指定数字以内的所有排列组合:
定义名称版:
=pmtB(指定数字)
=LAMBDA(x,IF(x=1,1,VSTACK(pmtB(x-1),SUBSTITUTE(BASE(SEQUENCE(x^x)-1,x,x),0,x))))
不定义名称版:
=LET(fx,LAMBDA(npmtB,x,IF(x=1,1,VSTACK(npmtB(npmtB,x-1),SUBSTITUTE(BASE(SEQUENCE(x^x)-1,x,x),0,x)))),fx(fx,B5))
看一下效果:
递归部分,就是一个纵向的堆叠,把1个数、两个数、三个数排列组合累在一起。
关键是Base!
这是一个将10进制转成任意进制的函数,需要转成几进制,第二参数就用几;转出来的结果要显示成几位数,第三参数就用几。
比如把0、1、2、3四个数转成二进制,保留两位,得到的结果分别是00、01、10、11。这结果是不是有种眼熟感?
对了,把0换成2,就是1和2的所有组合:22、21、12、11。
所以也可以反过来说,1和2的所有组合,就是4(也可以说成2的2次方)个数字的二进制,显示两位,再把其中的0换成2……这么多2(……
那么,1、2、3的所有组合,不就是27(3的3次方)个数的三进制,显示三位,再把其中的0换成3……
所以这公式就是:
=SUBSTITUTE(BASE(SEQUENCE(x^x)-1,x,x),0,x)
其中的x就是所期待的几位数……好吧,Excel同学最大就只能算到7。
没办法,谁让人家最多才一百多万行的容量呢。