ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 经典汉诺塔游戏

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-24 20:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:递归
本帖最后由 香川群子 于 2013-11-24 20:23 编辑

其实很多人的习惯是这么安排参数顺序的:
  1. Sub Hanoi1()
  2.     Call dg_Hanoi1(5, "A", "B", "C") '按A/B/C顺序,但同样是源针A、目标针C、过渡针B
  3. End Sub

  4. Sub dg_Hanoi1(n, a, b, c)
  5.     If n = 1 Then
  6.         Debug.Print "Move " & n & ": " & a & "→" & c
  7.     Else
  8.         Call dg_Hanoi1(n - 1, a, c, b)
  9.         Debug.Print "Move " & n & ": " & a & "→" & c
  10.         Call dg_Hanoi1(n - 1, b, a, c)
  11.     End If
  12. End Sub
复制代码
但后面函数中的顺序也会相应变化。总之,是 源针、过渡针、目标针的初始顺序。
于是就成了:
主过程顺序: a、b、c 源针、过渡针、目标针               参考我的顺序:a、c、b 源针、目标针、过渡针
递归过程-1: a、c、b 源针、过渡针、目标针                   我的过程-1:a、b、c 源针、目标针、过渡针
递归过程-2: b、a、c 源针、过渡针、目标针                   我的过程-2:b、c、a 源针、目标针、过渡针

喜欢哪一种顺序,就看你自己了。呵呵。

点评

烦请关注下帖:http://club.excelhome.net/thread-1169124-1-1.html  发表于 2014-11-29 01:20

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-11-24 20:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
{:soso_e179:}
“a、b、c 3个针参数,并非固定的(如果固定就不需要把参数作为变量传递了)
而是根据目前的状态而确定哪个针是源针、哪个针是目标针,哪个针是过渡针。
这一点,可能是很多人无法直接理解的原因吧。”

确实如此!
理解阶乘那样的单次递归调用不难。
汉诺塔这样两次递归调用,而且两次调用 的参数顺序又不同,就很容易让人迷失了。
几个回合下来就找不着北啦!
藕也一样。{:soso_e113:}

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-27 17:12 | 显示全部楼层
本帖最后由 香川群子 于 2013-11-27 21:42 编辑

Private Function DV_2$(a$, a_2$)
    DV_2 = Left(a_2, Len(a_2) - 1) & Mid((IIf(Mid(a, Len(a_2) - 1, 1) Mod 2, 11, 10) & Mid(a, Len(a_2))) * 5, 2)
End Function

Private Function PM_2$(a$, N_2a$, a_2$)
    PM_2 = Left(a, Len(a) - 1) & Mid(Left(Mid(N_2a, Len(a)) & "000", 3) + 1000 + Left(Mid(a_2, Len(a)) & "000", 3), 2)
End Function

试验中的个人用函数,在这里暂存一下……

Private Function DV_a$(a$, N_2a$)
    t1 = TM2(a, Left(N_2a, Len(N_2a) - 3))
    t2 = (1000000 - Mid(TM2(a, Left(N_2a, Len(N_2a) - 3)), Len(N_2a) - 4, 6)) / a
    DV_a = Left(N_2a, Len(N_2a) - 3) & Left(Format((1000000 - Mid(TM2(a, Left(N_2a, Len(N_2a) - 3)), Len(N_2a) - 4, 6)) / a, "00000"), 5)
   
End Function

Book2.rar (21.83 KB, 下载次数: 75)


TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-28 14:13 | 显示全部楼层
老谭酸菜 发表于 2013-11-24 20:39
“a、b、c 3个针参数,并非固定的(如果固定就不需要把参数作为变量传递了)
而是根据目前 ...

为你把 4阶汉诺塔的递归过程详细立出图表了。

这样应该可以理解了吧。

Hanoi.jpg

TA的精华主题

TA的得分主题

发表于 2014-4-10 21:12 | 显示全部楼层
香川群子 发表于 2013-11-24 17:40
归纳法证明:

首先,规定起始针叫做A、目标针叫做C、中间B针作为过渡。

  这个结论和打电话的数学结论一样,其过程说不定也有类似的地方,对于打电话的数学结论,做了以下罗列与研究:
   360截图-10683962.jpg

TA的精华主题

TA的得分主题

发表于 2014-4-10 21:18 | 显示全部楼层
香川群子 发表于 2013-11-24 17:59
首先我们先来看一下这个例子:

用递归方法计算自然数的阶乘:本来,如果使用For……Next循环,也可以轻松 ...

递归看来貌似是自我调用。。。第一次听这个概念,臆测……呵呵

TA的精华主题

TA的得分主题

发表于 2014-4-10 22:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 aoe1981 于 2014-4-10 22:27 编辑
香川群子 发表于 2013-11-24 20:05
不加注释的话,代码看上去非常简洁:

  很佩服,连续给出了每一个金片的移动方法,最小的金片编号1,最大的为n,A-B表示从A针移动到B针……能给出这样的结果,让人叹服,也就是说可以确保不多走一步多余步骤了……   360截图-15221142.jpg
  协助理解。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-5 12:23 | 显示全部楼层
增加一个演示附件。

hanoi move.zip

20.93 KB, 下载次数: 138

TA的精华主题

TA的得分主题

发表于 2014-11-5 12:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-10-26 11:40 | 显示全部楼层
本帖最后由 爱疯 于 2016-10-26 11:42 编辑
  1. Sub Hanoi1()    '11楼
  2.     Call dg_Hanoi1(2, "A", "B", "C")
  3. End Sub

  4. Sub dg_Hanoi1(n, a, b, c)                               'a,b,c只是代表,3个不同的变量
  5.     If n = 1 Then
  6.         Debug.Print "金片" & n & ": " & a & "→" & c
  7.     Else
  8.         Call dg_Hanoi1(n - 1, a, c, b)                  'a的n-1块移到b,用c过渡
  9.         Debug.Print "金片" & n & ": " & a & "→" & c    'a的第n块移到c
  10.         Call dg_Hanoi1(n - 1, b, a, c)                  'b的n-1块移到c,用a过渡
  11.     End If
  12. End Sub
复制代码

谢谢群子老师!
学习后还有点懵。。。
f(k+1)= f(k)+1+f(k),等式右边三项对应else中的三句


应关注参数a的位置意味着什么?源针。b和c同理
而不要关注参数名。


dg_Hanoi1()和dg_Hanoi2(),虽然参数的位置不一样,但注释是相同的
'源针的n-1块移到过渡针,用目的针过渡
'源针的第n块移到目的针
'过渡针的n-1块移到目的针,用源针过渡
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 21:37 , Processed in 0.042527 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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