ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2847|回复: 12

[原创] 跟着香川再做递归组合之新思路

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-11-13 23:09 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 aoe1981 于 2017-11-13 23:24 编辑

  说起组合代码,香川是高手,我是香川引入门的。
  香川生成组合的办法很多,我只较多地研究了递归组合。之前曾依样葫芦,做了一些,但毕竟没有新意,只为了学习递归。
  如今忽然有了灵感,想到了新思路,便又做了一个,贴出来,大家多担待。我之管见,所谓“新思路”或许并非前所没有,甚或是被唾弃的,而我却误打误拾。至少,再一次算做练习。

  附件如下(一个高版本,一个低版本):
   递归组合新思路aoe1981.zip (51.74 KB, 下载次数: 81)

  香川递归组合代码:
  1. Sub dgZH(s$, i&, t&)
  2.     Dim j&
  3.     For j = i + 1 To m
  4.         If t = n Then
  5.             k = k + 1
  6.             jg(k, 1) = s & sj(j)
  7.         Else
  8.             Call dgZH(s & sj(j), j, t + 1)
  9.         End If
  10.     Next
  11. End Sub
复制代码


  我的递归组合代码:
  1. Sub dgZHx(s$, mi&)
  2.     Dim j&, ss$
  3.     For j = 0 To 1
  4.         If j Then ss = sj(mi) Else ss = ""
  5.         If mi < m Then Call dgZHx(IIf(ss = "", s, ss & f & s), mi + 1) Else k = k + 1: jg(k, 1) = IIf(ss = "", s, ss & f & s)
  6.     Next j
  7. End Sub
复制代码
  所谓“新意”,在于我的代码不仅可以生成m选n的组合,还可以生成所有组合。什么是“所有组合”?即m个元素共2^m个组合。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-13 23:12 | 显示全部楼层
本帖最后由 aoe1981 于 2017-11-13 23:25 编辑

  有图更直接:
   360截图-13089825.jpg

  使用说明:
  1.在元素列添加或减少元素,元素总数由公式自动计算,各元素之间不要留空行。
  2.只需设置抽取数,为任意整数。
  3.抽取数n>=0且n<=m时,输出combin(m,n)组合结果;
   抽取数n<0或n>m时,输出2^m组合结果。
  4.道理如下:
   2^m=combin(m,0)+combin(m,1)+combin(m,2)+……+combin(m,m)
   二项式定理的特例。
  5.元素连接符的作用是,当各元素长度不一时,防止输出部分结果时出现错误;元素连接符不能与元素本身重复,且连接符的长度只能为1,否则输出部分结果时出错。
  6.由于2^20=1048576,请不要在元素个数超过20个的情况下生成所有组合结果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-13 23:19 | 显示全部楼层
  其实,我的递归组合的核心代码可以更简洁的。只是在输出部分组合(即m选n组合)时,当元素长度不统一时,便会出错。因为,我的思路是先产生2^m个全部组合,然后从中选取相应的m选n组合。如果只关注部分组合的话,这实在是舍近求远。但我的初衷是为了产生全部组合。
  为了增加灵活性,防止输出部分组合时的错误,我便加入了连接符,代码一下子复杂了,好在基本结构没有变化,但也差点被虐哭。
  ……
  好的,我交待完了。希望大家指点下。

TA的精华主题

TA的得分主题

发表于 2017-11-14 08:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢    分享     不懂  学习中

TA的精华主题

TA的得分主题

发表于 2017-11-14 09:45 | 显示全部楼层
aoe1981 发表于 2017-11-13 23:19
  其实,我的递归组合的核心代码可以更简洁的。只是在输出部分组合(即m选n组合)时,当元素长度不统一时 ...

好久不见,
这是重出江湖啊

TA的精华主题

TA的得分主题

发表于 2017-11-14 10:13 | 显示全部楼层
m选n “所有组合” 不就是增加外循环

for n= 0 to m
    call dgzh(m,n)
next

TA的精华主题

TA的得分主题

发表于 2017-11-14 10:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢    分享,学习学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-14 10:32 | 显示全部楼层
zopey 发表于 2017-11-14 10:13
m选n “所有组合” 不就是增加外循环

for n= 0 to m

也对,也对,多重复几次……

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-14 10:33 | 显示全部楼层
liulang0808 发表于 2017-11-14 09:45
好久不见,
这是重出江湖啊

不敢不敢,很多东西都忘了……只是记着泡论坛的快乐和充实……

TA的精华主题

TA的得分主题

发表于 2017-11-14 12:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
aoe1981 发表于 2017-11-13 23:19
  其实,我的递归组合的核心代码可以更简洁的。只是在输出部分组合(即m选n组合)时,当元素长度不统一时 ...

什么算法,递归组合,听来由来已久,只是还没有领悟,可能在依葫芦花样的“模仿”中,已经接触过,由于不曾入心,所以“老朋友”也会失之交臂,今后有请教的地方还望“后起之秀”的大侠指教。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 20:31 , Processed in 0.063336 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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