有十二个同样形状的球,其中一个或重于或轻于其他的球,用天平称找出这个球,而且分出这个球是重还是轻于其他的球。易语言采用递归法解决12球问题
将12个球分为1、2、3组各4球,称1、2组,如果平衡异常球在3组中,如果不平衡将天平的倾斜记录下来;
区别对待:
A、1、2组平衡时,坏球在第三组
B、1、2组不平衡时,坏球在两组之一,拿第1组与第3组比较平衡则2组有坏球,不平衡则1组有坏球。
比较4个小球
区别对待:
第1球与第2球等重,比较第1个与第3个,等重则第4球为坏球;不等则3球为坏球。
第1球与第2球不等重,比较第1个与第3个,等重则第2球为坏球,不等则第1各为坏球。
由此可以扩展为n球问题。
程序集变量
.版本 2 .程序集 启动窗口程序集 .程序集变量 小球数组, 整数型, , "12", 1表示正常,0表示轻,2表示重 .程序集变量 小球总数, 整数型 .程序集变量 轻重, 文本型
比较小球子程序
.版本 2
.子程序 比较小球子程序, , , 比较每组小球重量
.参数 小球起始编号, 整数型, , 每组小球的起始值
.参数 本组小球总数, 整数型, , 当前分组小球的个数
.局部变量 重量1, 整数型, , , 第一组小球重量
.局部变量 重量2, 整数型, , , 第二组小球重量
.局部变量 重量3, 整数型, , , 第三组小球重量
.局部变量 分组数, 整数型, , , 每组小球数
.局部变量 局部计次变量, 整数型
分组数 = 本组小球总数 ÷ 3
.如果真 (分组数 ≤ 1)
比较轻重子程序 (小球起始编号)
返回 ()
.如果真结束
.计次循环首 (分组数, 局部计次变量) ' 计算第一组重量
重量1 = 重量1 + 小球数组 [小球起始编号 - 1 + 局部计次变量]
.计次循环尾 ()
.计次循环首 (分组数, 局部计次变量) ' 计算第二组重量
重量2 = 重量2 + 小球数组 [小球起始编号 - 1 + 分组数 + 局部计次变量]
.计次循环尾 ()
.计次循环首 (分组数, 局部计次变量) ' 计算第三组重量
重量3 = 重量3 + 小球数组 [小球起始编号 - 1 + 2 × 分组数 + 局部计次变量]
.计次循环尾 ()
.判断开始 (重量1 = 重量2) ' 相等则坏球不在1组2组中
结果编辑框.加入文本 (到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 = ” + 到文本 (小球起始编号 + 分组数) + “-” + 到文本 (小球起始编号 - 1 + 2 × 分组数) + “的重量,坏球不在1组2组中”)
比较小球子程序 (小球起始编号 + 2 × 分组数, 分组数)
.默认
' 坏求在1组或2组中
' ' 1组重
.判断开始 (重量1 > 重量2)
结果编辑框.加入文本 (到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 > ” + 到文本 (小球起始编号 + 分组数) + “-” + 到文本 (小球起始编号 - 1 + 2 × 分组数) + “的重量,1组重”)
.判断开始 (重量1 = 重量3) ' 坏球在2组,轻
结果编辑框.加入文本 (#换行符 + 到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 = ” + 到文本 (小球起始编号 + 2 × 分组数) + “-” + 到文本 (小球起始编号 - 1 + 3 × 分组数) + “的重量,2组有轻球”)
比较小球子程序 (小球起始编号 + 分组数, 分组数)
.判断 (重量1 > 重量3) ' 坏球在1组,重
结果编辑框.加入文本 (#换行符 + 到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 > ” + 到文本 (小球起始编号 + 2 × 分组数) + “-” + 到文本 (小球起始编号 - 1 + 3 × 分组数) + “的重量,1组有重球”)
比较小球子程序 (小球起始编号, 分组数)
.默认
.判断结束
.默认
' 2组重(重量1<重量2)
结果编辑框.加入文本 (到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 < ” + 到文本 (小球起始编号 + 分组数) + “-” + 到文本 (小球起始编号 - 1 + 2 × 分组数) + “的重量,2组重”)
.判断开始 (重量1 = 重量3) ' 坏球在2组,重
结果编辑框.加入文本 (#换行符 + 到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 = ” + 到文本 (小球起始编号 + 2 × 分组数) + “-” + 到文本 (小球起始编号 - 1 + 3 × 分组数) + “的重量,2组有重球”)
比较小球子程序 (小球起始编号 + 分组数, 分组数)
.判断 (重量3 > 重量1) ' 坏球在1组,轻
结果编辑框.加入文本 (#换行符 + 到文本 (小球起始编号) + “-” + 到文本 (小球起始编号 - 1 + 分组数) + “的重量 〈 ” + 到文本 (小球起始编号 + 2 × 分组数) + “-” + 到文本 (小球起始编号 - 1 + 3 × 分组数) + “的重量,1组有轻球”)
比较小球子程序 (小球起始编号, 分组数)
.默认
.判断结束
.判断结束
.判断结束
返回 ()
比较轻重子程序
.版本 2 .子程序 比较轻重子程序, , , 比较单个小球的重量 .参数 小球起始编号, 整数型, , 该组的起始位置 .局部变量 重量1, 整数型, , , 该组第一个球重量 .局部变量 重量2, 整数型, , , 该组第二个球重量 .局部变量 重量3, 整数型, , , 该组第三个球重量 .局部变量 重量4, 整数型, , , 该组第四个球重量 重量1 = 小球数组 [小球起始编号] 重量2 = 小球数组 [小球起始编号 + 1] 重量3 = 小球数组 [小球起始编号 + 2] 重量4 = 小球数组 [小球起始编号 + 3] .判断开始 (重量1 = 重量2) ' 相等则坏球不在1组2组中 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 = ” + “第” + 到文本 (小球起始编号 + 1) + “小球重量”) .判断开始 (重量3 = 重量1) ' 坏球在第4组 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 2) + “小球重量 = ” + “第” + 到文本 (小球起始编号) + “小球重量”) .判断开始 (重量4 > 重量1) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 3) + “号球太重,是坏球”) .默认 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 3) + “号球太轻,是坏球”) .判断结束 .判断 (重量3 ≠ 重量1) ' 坏球在3组 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 2) + “小球重量 ≠ ” + “第” + 到文本 (小球起始编号) + “小球重量”) .判断开始 (重量3 > 重量1) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 2) + “号球太重,是坏球”) .默认 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 2) + “号球太轻,是坏球”) .判断结束 .默认 .判断结束 .默认 ' 坏求在1组或2组中 ' ' 1组重 .判断开始 (重量1 > 重量2) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 > ” + “第” + 到文本 (小球起始编号 + 1) + “小球重量”) .判断开始 (重量1 = 重量3) ' 坏球在2组,轻 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 = ” + “第” + 到文本 (小球起始编号 + 2) + “小球重量”) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 1) + “号球太轻是坏球”) .判断 (重量1 > 重量3) ' 坏球在1组,重 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 > ” + “第” + 到文本 (小球起始编号 + 2) + “小球重量”) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “号球太重,是坏球”) .默认 .判断结束 .默认 ' 2组重(重量1<重量2) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 < ” + “第” + 到文本 (小球起始编号 + 1) + “小球重量”) .判断开始 (重量3 = 重量1) ' 坏球在2组,重 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 = ” + “第” + 到文本 (小球起始编号 + 2) + “小球重量”) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号 + 1) + “号球太重,是坏球”) .判断 (重量3 > 重量1) ' 坏球在1组,轻 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “小球重量 < ” + “第” + 到文本 (小球起始编号 + 2) + “小球重量”) 结果编辑框.加入文本 (#换行符 + “第” + 到文本 (小球起始编号) + “号球太轻,是坏球”) .默认 .判断结束 .判断结束 .判断结束
计算
.版本 2 .子程序 _计算图形按钮_被单击 .局部变量 坏球编号, 整数型 .局部变量 局部计次变量, 整数型 结果编辑框.内容 = “” 小球总数 = 12 .计次循环首 (小球总数, 局部计次变量) 小球数组 [局部计次变量] = 1 .计次循环尾 () 坏球编号 = 到数值 (编号组合框.取项目文本 (编号组合框.现行选中项)) .判断开始 (重量组合框.取项目文本 (重量组合框.现行选中项) = “重”) 小球数组 [坏球编号] = 2 .默认 小球数组 [坏球编号] = 0 .判断结束 比较小球子程序 (1, 小球总数)