由数字1-6构成的六位波浪数数量计算及通用化方法咨询
由数字1-6构成的六位波浪数数量计算及通用化方法咨询
嗨,我来帮你理清楚这个波浪数的计数问题~首先先明确题目里的定义:
一个“波浪数”是指数字交替变大变小(或变小变大)的数。例如用1-6所有数字组成的163524(1<6>3<5>2<4)和634152(6>3<4>1<5>2)都是波浪数,但126543不是。
一、六位波浪数的数量计算
我们可以把波浪数分成两种完全互斥的类型,分别计算后相加:
- 类型1:小-大-小-大-小-大(奇数位数字 < 相邻偶数位数字,偶数位是“峰”),比如题目里的163524就属于这种。
- 类型2:大-小-大-小-大-小(奇数位数字 > 相邻偶数位数字,偶数位是“谷”),比如634152属于这种。
这两种类型的数量完全相等——你可以把类型1的每个数的每一位数字替换成7 - 原数字(因为1-6的互补数之和为7),比如163524会变成614253,这就是类型2的数,反过来也成立,所以两者是一一对应的,数量相同。
这种排列在组合数学里叫交替排列(alternating permutations),类型1是“up-down排列”,类型2是“down-up排列”。根据交替排列的计数结果,6个元素的up-down排列数是61,所以类型2也是61,六位波浪数的总数就是 61 + 61 = 122。
二、推广到1,2,...,n的通用情况
对于任意n,波浪数的总数同样是两种交替排列的数量之和:
- 当n=1时,只有1个波浪数(就是数字1本身)。
- 当n≥2时,两种交替排列(up-down和down-up)的数量相等,总数是
2 * E_n,其中E_n是n个元素的up-down排列数。
E_n可以通过以下方式获取:
1. 已知序列值
交替排列的数量(也叫secant-tangent数)有固定的序列,前几项如下:
| up-down排列数E_n |
|---|
| 1 |
| 1 |
| 2 |
| 5 |
| 16 |
| 61 |
| 272 |
| 1385 |
2. 递推公式
定义E_0 = 1(空排列),E_1 = 1,对于n≥3,可通过以下递推式计算:
E_n = Σ(k从1到n-1)C(n-1, k-1) * E_{k-1} * E_{n-k}
(注:C(a,b)表示从a个元素中选b个的组合数)
3. 生成函数(进阶)
如果熟悉生成函数,up-down排列数的指数生成函数为:
Σ(n=0到∞)E_n * x^n /n! = sec x + tan x
通过展开这个函数可以得到任意n对应的E_n。
总结一下,对于n个不同数字1到n组成的n位波浪数,总数就是两种交替排列的数量之和,当n≥2时等于2倍的up-down排列数。
备注:内容来源于stack exchange,提问作者C. de Haer




