易语言调用递归解决汉诺塔
汉诺塔是一种古老的游戏,是指在一柱(设为"甲"柱)上从下向上依次放着从大到小的一叠盘子,要把该柱("甲"柱)上的盘子全部搬到指定的柱上(设为"乙"柱),在搬运过程中,可以利用另外一根柱子(设为"丙"柱)来协助搬移,要求在搬移过程中必须始终(即每搬一步后)保持每根柱上("甲"、"乙"、"丙"柱)的盘子都是处于从大到小(从柱子下面至上面)依次排列的状态,试问怎样搬移盘子?最少需要搬几次才能把"甲"柱上的全部盘子移至"乙"柱?古印度梵教曾利用这种方法来推算宇宙末日之时间。
在移动的过程中,必须按照下述移动规则: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