易语言调用递归解决汉诺塔

易语言调用递归解决汉诺塔
汉诺塔是一种古老的应用,是指在一柱(设为"甲"柱)上从下向上依次放着从大到小的一叠盘子,要把该柱("甲"柱)上的盘子全部搬到指定的柱上(设为"乙"柱),在搬运过程中,可以利用另外一根柱子(设为"丙"柱)来协助搬移,要求在搬移过程中必须始终(即每搬一步后)保持每根柱上("甲"、"乙"、"丙"柱)的盘子都是处于从大到小(从柱子下面至上面)依次排列的状态,试问怎样搬移盘子?最少需要搬几次才能把"甲"柱上的全部盘子移至"乙"柱?古印度梵教曾利用这种方法来推算宇宙末日之时间。
在移动的过程中,必须按照下述移动规则:1. 直径较小的圆盘永远置于直径较大的圆盘上。2. 圆盘可任意地由任何一个木椿移到其他的木椿上。3. 每一次仅能移动一个圆盘。用递归调用的方法求解。

汉诺塔盘子运动

.版本 2
 
.子程序 汉诺塔盘子运动
.参数 盘子数, 整数型
.参数 柱子甲, 文本型
.参数 柱子乙, 文本型
.参数 柱子丙, 文本型
 
.如果 (盘子数 = 1)
    ' 如果只有一个盘,则直接将它从柱子一移动到柱子三
    移动 (1, 柱子甲, 柱子丙)
.否则
    ' 把1 ~ n - 1个盘从柱子一移动到柱子二,用柱子三作为中转
    汉诺塔盘子运动 (盘子数 - 1, 柱子甲, 柱子丙, 柱子乙)
    ' 把第n个盘从柱子一移动到柱子三
    移动 (盘子数, 柱子甲, 柱子丙)
    ' 把1 ~ n - 1个盘从柱子二移动到柱子三,用柱子一作为中转
    汉诺塔盘子运动 (盘子数 - 1, 柱子乙, 柱子甲, 柱子丙)

移动

.版本 2
 
.子程序 移动
.参数 盘子号, 整数型
.参数 甲柱子, 文本型
.参数 乙柱子, 文本型
 
路径 = 路径 + “步骤” + 到文本 (步骤) + “:” + “把” + 到文本 (盘子号) + “号圆盘从柱子 ” + 甲柱子 + “ 移动到” + 乙柱子 + “上 ” + #换行符
步骤 = 步骤 + 1

执行

界面窗口放置四个编辑框,三个代表三个盘子,第四个设置盘子的个数。

.版本 2
 
.子程序 _计算图形按钮_被单击
.局部变量 盘子总数, 整数型
.局部变量 现在柱子, 文本型
.局部变量 中间柱子, 文本型
.局部变量 目标柱子, 文本型
 
' 把盘子编辑框.内容传给现在柱子
现在柱子 = 盘子编辑框.内容
' 把中间编辑框.内容传给中间柱子
中间柱子 = 中间编辑框.内容
' 把目标编辑框.内容传给目标柱子
目标柱子 = 目标编辑框.内容
.如果真 (到数值 (现在柱子) ≤ 0 或 到数值 (中间柱子) ≤ 0 或 到数值 (目标柱子) ≤ 0 或 到数值 (个数编辑框.内容) ≤ 0 或 到数值 (个数编辑框.内容) > 10)
    信息框 (“柱子或圆盘数量只能是大于0小于10的数字!”, #错误图标, “出现错误了:”)
    返回 ()
.如果真结束
 
盘子总数 = 到数值 (个数编辑框.内容)
结果编辑框.内容 = “”
路径 = “”
' 首次调用汉诺塔盘子运动 ()程序
汉诺塔盘子运动 (盘子总数, 现在柱子, 中间柱子, 目标柱子)
结果编辑框.内容 = 路径
步骤 = 1

分享到:

用微信扫一扫,分享给朋友


发布日期:

所属分类: 编程 标签: