aoe1981 发表于 2014-10-22 20:22 
这是我总结的跳位方法,来个文字的,备注下:
因此,可以粗略地想见,我们的跳位原则是:
1.从组合结果最 ...
嗯。你的理解是正确的。
我在生成组合循环过程中,主要使用了两个参数 i 和 j 。
其中, j 是组合位、变动取值范围 1 To n (需要抽取n个元素)
i 是组合抽取元素的序号、变动取值范围 1 To m (数据一共m个元素)
计算过程、规则如下:
1、初始化
j 从 1 To n到达末尾n位置,i 也从 1 To n (未到最大值m)
2、正式开始循环
a. 首先固定 j位置=n 即在末尾 n位置不变,而 i 进行 For循环从 i +1 To m;
b. j 从 n-1 To 1 倒序检查,读取该位置的 i 值,并+1 升位,
然后检查升位以后的 i 值是否已达最高位置,即 i = m-n+j 表明下一次已经不能升位了,
且当前状态就是有效组合之一,所以直接记录。
c. 在b状态时,继续位置 j-1 向前移动、然后读取 i 值并检查,直到升位以后的 i +1 < m-n+j ,则表明可以向后升位了。
d. 在c状态时,则应位置 j+1 向后移动、然后把该位置的 i 值更新为 i +1……直到n-1位置。
f. j 移动到末尾位置,可以回到a开始新的Do循环。
…………直至最后 j = 0时结束。
…………如果是 1、2、3、4、5、6 这m=6个数中任取n=4个进行组合,则过程如下:
① 初始化,
a = 1,2,3,?
此时,j=n=4、i =3
② 末尾位置递增到m=6
1,2,3,4
1,2,3,5
1,2,3,6
③ 检查j=n-1 To 1 并升位
1,2,4,? 由于4<最终组合 3,4,5,6中的5,可以j=j+1向后继续
④ j=n、末尾位置i+1递增直到m=6
1,2,4,5
1,2,4,6
⑤ 检查j=j-1=3 时,发现4+1=5已到最高位置(m-n+j)
1,2,5,6于是直接记录该有效组合
⑥ 继续向前检查
1,2,5,6 → 因为2+1<4 所以可以继续
1,3,4,5
⑦ 继续②开始的步骤
1,3,4,6
1,3,5,6
1,4,5,6
然后继续:
2,3,4,5
2,3,4,6
2,3,5,6
2,4,5,6
3,4,5,6
|