5.7 要点6:找出数字间的规律
所有的信息都可以用数字表示 – 这是计算机的特性之一。因此,为了构造算法,经常会利用到存在于数字间的规律。例如,请思考一下判定石头剪刀布游戏胜负的算法,如果把石头、剪刀、布分别用数字0,1,2表示,把玩家A做出的手势用变量A表示,玩家B做出的手势用变量B表示,那么变量A和变量B中所存储的值就是这一个数中的某一个。请以此判断玩家A和B的输赢
如果算法没有使用任何技巧,也许就会通过枚举表5.2所列出的9(3*3)种组合来判定输赢吧。把这个表格转换成程序后就得到了代码清单5.4.可以看出这是一种冗长而双枯燥的判断方法(代码清单5.4和5.5列出的都只是程序的一部分,因此不能直接运行)
表5.2 判定石头剪刀布输赢的表
变量A的值 变量B的值 判定结果
0(石头) 0(石头) 平局
0(石头) 1(剪刀) 玩家A获胜
0(石头) 2(布) 玩家B获胜
1(剪刀) 0(石头) 玩家B获胜
1(剪刀) 1(剪刀) 平局
1(剪刀) 2(布) 玩家A获胜
2(布) 0(石头) 玩家A获胜
2(布) 1(剪刀) 玩家B获胜
2(布) 2(布) 平局
代码清单5.4 判断石头剪刀布输赢的程序(方法一)
If (A=0) And (B=0) Then
MsgBox “平局”
ElseIf(A=0) And (B=1) Then
MsgBox “玩家A获胜”
ElseIf(A=0) And (B=2) Then
MsgBox “玩家B获胜”
ElseIf(A=1) And (B=0) Then
MsgBox “玩家B获胜”
ElseIf(A=1) And (B=1) Then
MsgBox “平局”
ElseIf(A=1) And (B=2) Then
MsgBox “玩家A获胜”
ElseIf(A=2) And (B=0) Then
MsgBox “玩家A获胜”
ElseIf(A=2) And (B=1) Then
MsgBox “玩家B获胜”
ElseIf(A=2) And (B=2) Then
MsgBox “平局”
End If
接下来试着在此加入些技巧吧。请仔细观察表5.2并找出数字间的一种规律,这个规律可简单地判定是玩家A获胜、玩家B获胜、平局这三种结果。可能需要习惯一下思维上的转变。但最终应该都可以发现如下的规律:
² 如果变量A和变量B相等就是“平局”
² 如果用B+1除以3得到的余数与变量A相等就是“玩家B获胜”
² 其余的情况都是玩家A获胜
用程序来表示这个规律就得到了如代码清单5.5所示的代码,与没有使用任何技巧的代码清单5.4中的代码相比,可以发现处理过程简单并且代码短小精悍,当然程序的执行速度也会提升
代码清单5.5 判断石头剪刀布输赢的程序(方法二)
If A=B Then
MsgBox “平局”
ElseIf A=(B+1) Mod 3 Then
MsgBox “玩家B获胜”
Else
MsgBox “玩家A获得”
End If
构造算法时需要找出数字间的规律不仅适用于数学游戏,编写用于计算工资的应用程序时,计算工资的规则也可以说是一种数字上的规律。如果能够发现“工资=底薪+加班补贴+交通补贴-预扣税款”这样的规律,那么解决问题的步骤就是明确的,步骤数也是有限的,因此构造出的算法也就是优秀的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论