24 点游戏是一个很有意思的数字游戏,也是一道常见的算法面试题。题目是这样的:任给四个数(为了便于人们心算或口算,一般都是小于 10 的数),对四个数字用各种组合进行加、减、乘、除四则运算,看看结果是否能等于 24?对于面试题来说,这是一个典型的穷举类型算法问题。这个题目比较有意思的地方是它除了要对数字组合进行枚举,还要对四个运算符进行组合。这一课我们要介绍的方法有点特殊,它没有简单地使用穷举遍历,而是采用穷举法和分治法相结合的方法来解决这个问题,这种方法比数字 + 运算符一起枚举的方法简单,容易理解,整个算法只有大约 40 行有效代码,其中主体部分有效代码只有不到 20 行,快来看看是怎么回事儿吧。
问题分析与建模
这个算法问题的难点主要有两个,一个是数字和运算符的穷举遍历,另一个是将四则运算表达式作为结果输出。无论是运算符遍历还是表达式输出,都要考虑运算符的优先级,必要时要加括号。当然,也可以采用后缀表达式的形式,避免在枚举遍历的过程中考虑括号的问题。一般我们书写和计算都采用中缀表达式,中缀表达式的特点是运算符始终位于两个操作数的中间,对于运算符的优先级采用括号的方式解决,比如以下四则运算采用的就是中缀表达式的形式:
7 + ( 3 + 2 ) × 4 − 8