ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 递归例子:1到100自然数中和为100的所有组合最简单代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-28 23:02 | 显示全部楼层 |阅读模式
题目:求1到100自然数中和为100的所有组合
代码很简单,只有26行,具体如下:
Sub hualu()  '主程序
Dim ar, br(), i&, k&, h, t
t = Timer
ReDim ar(1 To 100)
For i = 1 To 100
    ar(i) = i
Next i
h = 100
Call digui(0, "", 100, ar, br, k, h)
MsgBox Format(Timer - t, "0.00") & "|" & k
End Sub
Sub digui(r, s, n, ar, br, k, h)  '递归程序
If r > h Then Exit Sub
Dim i&
If r = h Then
    k = k + 1
    ReDim Preserve br(1 To k)
    br(k) = s
    If k < 100 Then
        Cells(k, "a") = s
    End If
End If
For i = n To 1 Step -1
    Call digui(r + ar(i), s & "+" & ar(i), i - 1, ar, br, k, h)  '递归调用
Next i
End Sub
本帖目的:
1、通过此代码简单了解递归的工作原理
2、了解凑数的基本思路

注:以上代码由香川老师的代码提炼而成
更详细的答案:http://club.excelhome.net/thread-151178-1-1.html

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-29 05:04 | 显示全部楼层
  1. Dim s&, n&
  2. Sub dsmch()
  3. n = 100
  4. s = 0
  5. dg 0, "", s
  6. End Sub
  7. Sub dg(h, p, s)
  8. If h = n Then
  9.     s = s + 1
  10.     Cells(s, 1) = Mid(p, 2)
  11. ElseIf h < n Then
  12.     For i = n To 1 Step -1
  13.         dg h + i, p & "+" & i, s
  14.     Next
  15. End If
  16. End Sub
复制代码

点评

递归思路别具一格,强大  发表于 2018-12-29 08:49

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-8 10:57 | 显示全部楼层
Sub 手机号()
Dim thispath, thisname, myfile, myxls, r&
Call 去除受保护视图
thispath = ThisWorkbook.Path & "\专项附加扣除信息(导出)\"
thisname = ThisWorkbook.Name
myfile = Dir(thispath)
[a1] = "姓名"
[b1] = "身份证号"
[c1] = "手机号"
r = 1
Application.ErrorCheckingOptions.NumberAsText = False
Do While myfile <> ""
    Set myxls = Workbooks.Open(thispath & myfile)
    r = r + 1
    Cells(r, "a") = myxls.Sheets(1).Range("b4")
    Cells(r, "b") = myxls.Sheets(1).Range("c6")
    Cells(r, "c") = myxls.Sheets(1).Range("g5")
    myxls.Close False
    myfile = Dir
Loop
r = Range("a65536").End(3).Row
Range("A1:C" & r).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
    xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    SortMethod:=xlPinYin, DataOption1:=xlSortNormal
End Sub
Sub 去除受保护视图()  '修改注册表
    Dim v, objwmi
    Const HKEY_CURRENT_USER = &H80000001
    Set objwmi = GetObject("winmgmts:\\.\root\default:StdRegProv")
    v = Application.Version
    objwmi.CreateKey HKEY_CURRENT_USER, "Software\Microsoft\Office\" & v & "\Excel\Security\FileValidation"
    objwmi.SetDWORDValue HKEY_CURRENT_USER, "Software\Microsoft\Office\" & v & "\Excel\Security\FileValidation", "EnableOnLoad", 0
End Sub

华丰教师手机号 - 副本.rar (71.73 KB, 下载次数: 6)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-24 18:29 | 显示全部楼层
本帖最后由 小花鹿 于 2019-3-24 21:36 编辑

Sub delete()
    With ActiveDocument.Content.Find
        .Execute ChrW(61623), , , 1, , , , , , "", 2     '一种特殊字符,显示为一个圆点
        .Execute "^11", , , 1, , , , 0, , "^p", 2        '软回车变为硬回车
        .Execute "^13", , , 1, , , , 0, , "^p", 2        '有时光标可移到硬回车后面,可用这种方法解决
        .Execute "^p^w", , , 0, , , , 0, , "^p", 2       '删除段前空白
        .Execute "^w^p", , , 0, , , , 0, , "^p", 2       '删除段后空白
        .Execute "^13{1,}", , , 1, , , , 0, , "^p", 2    '删除空行
    End With
End Sub
Sub 答案换行()
    With ActiveDocument.Content.Find
        .Execute "[A-E]、", , , 1, , , , 0, , "^13^&", 2
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2019-3-24 18:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
和为100的组合是指两两组合?20+30+50算不算?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 19:43 , Processed in 0.040151 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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