友情提示:380元/半年,儿童学编程,就上码丁实验室。
题目:在五个3之间,填上加、减、乘、除和括号,使得结果为6。请至少给出8种方法。其中〇表示算符。
数学解法:这个题目,如果做为数学题来解,常采用倒推法。例如,最后一个3前面填上“+”号,于是问题转换为四个3之间,填上适当的算符和括号,使得结果为3。
用这种思路求出8个解是没有什么问题的。但是,如果想求出所有解,就必须用编程的思路。
编程解法:根据上一期处理“算24”的方法,可以知道它们是同类问题。不同点在于:1)不需要做全排列了,因为所有数字都一样,是3;2)五个3,中间要填四个算符,比“算24”的四个数字填写三个算符高了一阶。
难点还是在于括号的处理。这里采用降阶的方式来解决。
三阶:如果三个数字填二个算符,括号只有两种填法。如下所示:
四阶:如果是四个数字填三个算符,先考虑添加一个括号,将算式变为只有三个数字的情况:
然后套用前述三个数字填两个算符的结论。对于(1)式,第二个括号有两种填法:
对于(2)式,第二个括号的填法为:
对于(3)式,第二个括号的填法为:
显然(8)式与(5)式相同,可以不考虑。因此括号有5种填法。
五阶:如果是五个数字填四个算符,先考虑添加一个括号,将算式变为只有四个数字的情况:
采用类似上述的分析,结论如下。
对于式(10),
对于式(11),
对于式(12),
对于式(13),
其中,式(m11)与式(m3)重复,式(m16)与式(m1)重复,式(m17)与式(m5)重复,式(m18)与式(m7)重复,式(m19)与式(m10)重复。因此,括号有15种填法。
程序结果:将上述15种情形,分别进行“运算符枚举”,得到6的结果如下:
M1 |
M2 |
M3 |
M4 |
M5 |
M6 |
M7 |
M8 |
13 |
8 |
9 |
11 |
8 |
8 |
3 |
11 |
M9 |
M10 |
M12 |
M13 |
M14 |
M15 |
M20 |
合计 |
7 |
3 |
11 |
8 |
4 |
6 |
3 |
113 |
后记:一般认为5个以上的变元就不属于简单问题,本例就是一个佐证。ps.经研究发现,Scratch 2.0支持传递参数。但是无返回值,需要通过全局变量来传递。据说将在3.0解决这个问题。
始发于微信公众号:
全不知老师