Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
123
返回列表 发新帖
楼主: 爱疯

[已解决]这类循环方式是针对什么问题的

[复制链接]
发表于 2012-11-11 22:38 | 显示全部楼层
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2012-11-16 22:07 | 显示全部楼层
爱疯 发表于 2012-11-11 21:55
谢谢群子老师!

下去再慢慢理解了

对15楼VBA数组组合算法的举例说明:

我的VBA组合算法思路是这样的:
假定从m个元素中抽取不重复的n个值,下面举例m=6,n=3
一. 定义一个数组 Redim a(1 to n), 存放1-n各个组合数位的状态结果
   那么第一次就是 1,2,3

二. 末位递增,即1,2,3 → 1,2,4 → 1,2,5 → 1,2,6 → 1,2,7

三. 每次检查末位,当末位值大于m时(即1,2,7),进行如下操作。
    1. 倒序检查各数位
        a. 如果该数位可以递增则停止。 如 1,2,7 或 1,3,7 或 1,4,7 时
        b. 如果该数位已经不可以递增时则即继续检查前一数位。 如 1,5,7 时下一步不可递增为1,6,6
    2. 可递增数位+1
    3. 可递增数位以后顺序递增。结果例子如下:
         1,2,7 → 1,3,4  (中间第2位 2可递增到3)
         1,4,7 → 1,5,6  (中间第2位 4可递增到5)
         2,5,7 → 3,4,5  (中间第2位 5已经不可递增到6,但首位2可递增到3)
         3,5,7 → 4,5,6  (中间第2位 5已经不可递增到6,但首位3可递增到4)
    4. 最后检查首位如果已经到最大值 (如4,5,6进位后变成4,5,7检查处理最后变成5,6,7时),则退出循环结束组合计算。

四. for……next 循环执行第三步。


以上反复进行,就能高效地遍历得到所有组合解了。

这个算法,一般情况下就是直接进行末位递增,仅仅当末位到底时才需要检查处理,算法效率就高了。




回复

使用道具 举报

 楼主| 发表于 2012-11-16 23:46 | 显示全部楼层
香川群子 发表于 2012-11-16 22:07
对15楼VBA数组组合算法的举例说明:

我的VBA组合算法思路是这样的:

我另发帖了:http://www.excelpx.com/thread-290190-1-1.html

每次你的回复都是很充分,实在很感谢!如果问题中有的已解释过,给个提示就好了。
希望能向你这样的高高手们多了解一点点学习方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-29 18:21 , Processed in 0.261010 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表