Mathematica 谜中智:二十四点 全新计算

引言

纲要

主要函数

Binomial、Subsets、Permutations、Groupings、HoldForm、ReleaseHold

内容摘要

24点是一项在学校或家庭都十分流行的数学游戏,本篇以一种全新的方式进行阐述和说明。

关键词汇

24点、四则运算、二元运算、排列、组合、二项式、归组、二叉树、因数分解

下载链接

http://demonstrations.wolfram.com/Calculating24/

讲述方式

本篇讲述了一种源于中国的数学游戏"24 点",它几乎同小学数学的所有知识都有关。

谜面

"算24点"的游戏规则十分简单,可表述如下:

1. 一副扑克牌中抽去大小王剩下52 张,随后取4张数字牌,每张扑克牌代表一个数字,数值范围从1到13,其中 Jack (J)、Queen (Q) 和 King (K) 分别代表11、12 和 13;

2. 随后仅可使用基本的四则运算符:加法(➕)、减法 (➖)、乘法 (✖️) 和除法(➗);

3. 可表述或设定计算的优先级或顺序,这个游戏的难点在于正确理解和表达计算的优先级;

4. 试图从四张牌中算出一个目标数值如24,且每张牌必须用一次且只能用一次,并表达出计算过程。例如,给定4个数分别为 5、5、7 和 7,求24。可以通过表达式 (7x7)-(5x5) = 24 得到解决。

如下有5题难度不等的24点题目,请读者动动手、动动脑,如何算出24点?

谜底

以下给出上述 5 题的标准答案,依次讨论和分析应当如何解题,并引出24点的难易程度分级概念。

问题 Q1

非常简单和容易的题目,小学二年级以上学过九九乘法口诀表的同学们就应该能够想到。它可以从2x12=24;3x8=24;4x6=24等多种思路找到答案,解的数量也并不唯一,共有如下右侧所示 5组答案。

问题 Q2

相对简单的题目,难度略有提升之处在于题目中包含了一个2位数13,它也可以从 2x12=24;3x8=24等多种思路找到答案,解的数量不唯一,共有4组答案。

问题 Q3

难度适中的题目,它可以从 3x8=24 的思路找到前面2组解,但由于第3组解涉及除法和分数,其实对大部分人第3组解都不太易想到,此题一共有3组标准解法和答案。

问题 Q4

略有难度的题目,解题步骤:首先10x10=100,随后100-4=96,最后96/4=24得到答案。解题过程不仅涉及了像100和96这样较大的2位数,而且还涉及96/4=24这样的2位数除法的心算,其实对小学3年级以上同学都有相当挑战性,此题仅有1组标准解法和答案。

问题 Q5

典型的难度题目,解题步骤:首先1/5=0.2,随后5-0.2=4.8,最后4.8x5=24得到答案。解题过程不仅涉及了像0.2和4.8这样的小数或分数,而且还涉及了如4.8x5=24和1/5=0.2 的小数乘法和除法运算,对小学4-5年级以上同学都有相当挑战性,此题仅有1组标准解法和答案。

小结:以上通过对5道代表性题目的举例和讲解,让读者体验24点的解题思路,感受24点的难易程度。在本篇的最后一小结,作者将进一步说明可从2个不同的角度(统计和计算)对24点难易程度进行定量评估。

2. 问题求解

2.1

问题的定义

如下我们以稍严谨一点的表述来定义24点问题,以确定求解目标、已知输入和边界条件。

标准型问题定义:

如下定义4张扑克(扑克的数值范围从1到13);

1. 取4张扑克牌,每张扑克牌代表一个数字,数值范围从1到13,包括 Jack (J)、Queen (Q) 和 King (K), 分别代表11、12 和 13;

2. 仅使用基本的四则运算符:加法(+)、减法(-)、乘法(*)和除法(/);

3. 可使用成对的括号来设定计算的优先级,这个游戏的关键在于理解括号的作用和优先级;

4. 试图从四张牌中算出一个目标数值,如24。

简化型问题定义:

如下定义4张扑克(扑克的数值范围从1到10);

1. 取4张扑克牌,每张扑克牌代表一个数字,数值范围从1到10,不包括 Jack (J)、Queen (Q) 和 King (K);

2. 仅使用基本的四则运算符:加法(➕)、减法 (➖)、乘法 (✖️) 和除法(➗);

3. 可使用成对的括号来设定计算的优先级,这个游戏的关键在于理解括号的作用和优先级;

4. 试图从四张牌中算出一个目标数值,如24。

简化型问题更适合初学者,如二、三年级的小学生,需要一个由易到难的进阶过程。当然,简化型问题是在标准型问题上的简化和裁剪,标准型问题覆盖所有简化型的情况。

2.2

问题的规模

站在玩游戏的角度,24点是一个可供中小学生进行四则运算练习的计算题。而站在更高一点的角度,试图通过数学和计算机将所有的24点问题全部解决,它更像是一道不大不小的组合数学问题。以下我们采用组合数学的知识和方法,将24点问题进行分析并对组合的规模进行定量评估和分析,给出如下24点标准型问题和解题的路线总图。

2.1.1

题的排列数

假设依次生成4张扑克(数字1-13)的元组排列数,即考虑4张扑克或数字的先后顺序,得到结果是28561种。

同样,依次生成4张扑克(数字1-13)的元组排列数,即考虑4张扑克或数字的先后顺序,采用公式计算为n^m=13^4 。

2.2.2

题的组合数

提问1:抽取4张扑克来算24点,那么一共会有多少题目?

如下通过生成组合数再次验证一下,依次生成4张扑克(数字1-13)的元组组合数,即不考虑4张扑克或数字的先后顺序,依此排序并筛除重复项,验证结果为是1820种,它同采用二项式系数计算结果相同。

同样通过生成组合数再次验证,依次生成4张扑克(数字1-10)的元组组合数,即不考虑4张扑克或数字的先后顺序,依此排序并筛除重复项,验证结果也是715种,同采用二项式系数计算结果相同。

2.2.3

解的排列表达式数量(有重复情况)

所有24点的可行解的可以看作是由 m 个数字的排列、p 个二元运算符号的排列和 k 种二元归组方式所共同组成的数学表达式的集合。

2.2.3.1

数字的排列

如下依次列举说明,首先从已抽取的 m=4 张扑克组成一个牌组,由这4 张扑克牌构成的排列数为 m! 。

2.2.3.2

运算符号的排列

2.2.3.3

二元归组方式组合

采用编程或计算机解24点中,对括号和二元归组的理解是一个问题的核心难点。为帮助读者正确地理解括号的有效表达和二元分组的概念,我们先举一个简单的例子,对于3个数字的表达式,在数字和符号排列都已经明确的前提下,可以获得如下 (1+2)x3=9 和1+(2x3)=7,共2种括号的归组方式。

在 Mathematica 版本12 以上,可以采用新函数 Groupings非常容易地来获得二元归组的组合方式,代码如下。

在实际教学中,作者经常遇见非常认真的小同学和家长们对使用括号的表达提出疑问,如对于上述 1+(2x3)=7 这样的表达方式存在质疑。因为在小学数学课堂上老师讲述,在四则运算中,认为乘法和除法的计算优先级高于加法和减法,所以在默认情况下不需要再对(2x3) 以括号的形式进行表达,而应该直接写成 1+2x3=7,数学的表达应该越简洁越好。

如上式第一行所列这种省略括号(默认优先级)的数学表达式当然是正确的,但第二行体现括号的表达式在数学和计算上讲也是正确的。如我们之前所述,所有的表达应该有助于体现思想。

由于本篇是要解决一个关于24点的排列组合问题,且括号(或者说二元运算符号的计算优先级)对本问题十分重要,所以作者将它们体现出来,强调一下,不做省略。甚至在下面的个例子中,将两次二元运算对应的两组括号"十分夸张地"全部体现出来,以此来帮助读者理解括号和二元归组的关系。

这些对数学表达的质疑和深究都是相当好的,作者稍费些笔墨进行阐述和辨析,随后我们再进入4张扑克或4个数字的二元归组和括号表达。

进一步对概念进行抽象和提炼,认为括号表达的计算优先级其实可以等效于对二元归组方式的体现或表达。依次排列的4个不相同数的二元归组,它们所有可行的归组方式所列如下,数量 k 为5组,即括号表达的计算优先级的顺序的组合数量为5组。

如下将二元归组的方式同二叉树对应起来共同表达。

其中,a b c d 分别代表4个不同的数或牌;○ 代表四种不同的二元运算符中的任意一种,()代表了二元运算符计算的优先级,或二元归组的方式。在4个数字和3个符号排列都已经明确的前提下,对依次排列的4个不同数进行二元归组,可理解为对它们共进行了3次二元运算,每次的运算优先级对应为3组小括号,即对这4个数以2个数为一组的方式进行归组,可行归组方式的数量 k 为5组,5组表达式所列如下。在不同数字、不同符号、不同的归组方式构成的排列组合下,会得到各不相同的计算结果。

在4个数字和3个符号排列都已经明确的前提下,如下采用二叉树的形式表达二元归组(计算优先级的不同组合)情况,如下二叉树能更好地体现了二元归组的结构特点。如下图和图标所示,a、b、c和d分别代表4个不同的数或牌;○ 代表四种不同的二元运算符的任意一种,下标1、2和3代表了二元运算符计算的优先级;()括号也代表了二元运算符计算的优先级,优先级顺序同 ○ 下标表达的顺序一致。这样将上标的括号表达式和下图的二叉树完全建立对应关系,使读者可以一目了然,更好地理解括号定义的计算优先级,更好地理解5种二元归组方式和结构特点。

2.2.3.4

汇总所有排列组合

2.2.4

解的组合表达式数量(无重复情况)

如下我们就定义一个24点求解所有24点的表达式的函数,这个函数包含4个数的排列、二元运算符的排列以及二元归组的所有组合情况。

然而7680种的组合表达式是否就是计算24点最充分且最必要的表达式的数量呢?如下我们先通过一次计算实验进行验证。

在1-100范围内,随机的选取4个素数Prime作为输入数值,然后计算并去除相同结果的情况。可见24点计算无重复的表达式的组合数应该小于7680,且它的上界很可能就是1170组。

由于采用了素数 Prime 作为输入数字计算,因此大部分表达式计算结果都会是唯一的、不重复的浮点数值。以此结果统计出,多项式表达式无重复的结果上界是1170组。

通过以上数值验证,我们可以提出或者质疑一个非常有趣的问题,为什么24点解法表达式(无重复)的数量是1170组,而不再是7620组呢?

24点所有的可行解可以看作是由 m 个数字或 m 张扑克牌、 p 种运算符号和k 种归组方式所排列组合的多项式集合。但由于加法、减法、乘法和除法的交换率、结合律、分配率等等多项式性质,造成排列组合后得到的表达式存在大量等效重复的情况。解决方法是可采用多项式分解因式可去除这些重复等效的多项式。对该问题感兴趣的读者可以详细参见文献,对不重复地枚举 24 点算式做了详细的阐述。

该问题研究的结论已经被记载入整数数列在线百科全书 The On-Line Encyclopedia of Integer Sequences (OEIS) 中了,编号:A140606。这是一个很有意思的数列,可以说它是一个由一群中国数学爱好者因为玩24点所发现的一组新的整数数列。

名称:n个运算数的不等式数量

编号:A140606

定义:仅使用四种二元运算符(+, -, x, /),允许使用()小括号设定计算的优先级。表达式 (a+b)-c 等效于表达式 a-c+b 和 a+b-c。又如表达式 (a-b)/(c-d)等效于 (b-a)/(d-c)。如 (a+b)-c 则不同于 a-b+c。又如表达式 (a-b)/(c-d) 也不等效于 (a-b)/(d-c)。两种不等效的举例,它们都会造成表达式最终计算结果数值的不同。 如下列出该A140606数列的前10项:

数列:1, 6, 68, 1170, 27142, 793002, 27914126, 1150212810, 54326011414, 2894532443154。

在该数列中,当 n=4 时,即第4项,正好等于 1170。即选择4个数字仅使用4种二元运算符号,它们构成的不重复的表达式数量为1170。进一步将7620组表达式,通过因式分解后,将等效重复的表达式进行归类,使其数值可视化。

如下我们随机列举了一些等效表达式的情况,读者可也观察比较。

在7620组表达式中,其多项式因式分解等效重复的情况通过直方图可视化。

因此我们重新定义24点求解函数,在原有函数包含4个数的排列、4种二元运算的排列、5种二元素归组的所有排列组合的基础上,再通过因式分解去除等效重复的多项式表达式,所得的数量为1170。如下两行代码是24点求解的核心代码,非常简单,非常简洁,读者需正确理解。在当前问题定义的框架下,这样的计算是完整的,算法是干净的,没有遗漏的情况、也没有冗余的计算。

2.3

自动求解器

如下基于"24点求解函数"作为关键核心功能,编写一个自动24点的求解器,主要是增加了一些操控的界面和菜单,并将解题的答案自动展示出来。

2.4

过程可视化

绘图可视化

提问4:计算机是如何算24点的?它的过程是怎样的?

为进一步帮助读者理解"24点求解函数"的算法过程,可绘制点线图来可视化算法计算的过程。计算机自动求解24点的过程实际就是根据输入的数字(题目),将所述1170组表达式作为可行解全都算一遍,图中蓝色的小点就代表每个可行解的计算结果。

如果它们中间正好有结果等于24或目标答案,图中红色水平线代表24,就把这种情况挑选出来作为正确的解;如果没有结果正好等于24,那么该题就是无解的。

结构树可视化

为进一步帮助读者理解4个数字全排列、二元运算符以及二元归组整体排列组合后的表达,如下举一些具体的表达式例子,并通过二叉树的形式将其可视化。

如上按顺序列举了从第3211至第3219组表达式的形式,可以看到这9组表达式排列组合的变化和差异。

进一步以随机的方式抽取了一些代表性的表达式,读者可对照表达式和二叉树进行理解。

需要指出的是它们的实质仍然是数字全排列、二元运算符号以及二元归组不同排列组合后构成的表达式。只不过对于计算机处理,没有特指的减法(-) 或除法(/),仅有加法(+) 和乘法(*),并且对于减法(-) Mathematica 会统一采用"加上乘以 -1",即 x-y = x+(-1*y) 的形式等效替代;对于除法(/) 会统一采用"乘以-1次幂的指数",即 x/y = x y^-1 的形式等效替代。

3. 数学拓展

3.1

可解性(有解或无解)

提问5:算24点,为什么有的题是有解、有些题是无解的?一共有多少题是无解的?

定量评估这个游戏的可解性,例如4张牌算24点,在1820个牌组中,其有解的牌组共为1362,即的可解性为74.8%。

以4个数字求解一个目标整数(在0-100的范围内),求解24点的有解的比率,如下图红点所示位置,可解性为74.8%,约3/4。

提问6:已知4张扑克来算24点,那么为什么一定要算24,而不是其他数字 2、10、12 或 36?

首先24点作为一个数学游戏的流行有一定历史传承的因素,或者说"通行既久,约定成俗"。最先发明这个游戏的人(也许某位数学老师或数学爱好者),他或她选择了24,久而久之,大家都这么玩,这么叫,就成为了一种习俗,就形成了现在的24点了。

从数学或可解性的角度而言,很难做一个绝对定量的解释,或是简单地一概而论。为何选择24这个数字?我们仅能定性的说:24这个数字在1-100的区间内,数值不算太大也不算太不小,同学们可以综合的运用数学知识练习运算。而24的可解性约74.8%,正因为有一部分题是无解的,所有才增加了题目的不确定性、挑战性和可玩性。当然,如果以娱乐或练习为目标,选择其他数字作为目标也是完全可以的。

3.2

多解性(从统计观点:单解或多解)

提问7:24点中多解的题一共有多少?解题方式(解题表达式)最多的题是怎样的?

从统计角度:答案究竟是多解、单解还是无解?根据所有已获得的答案列表,依据正确解题表达式的数量对24点题目的难度进行统计分级。

如下图所示,无解的题目(解的数量为0)为458题,单解的题目(解的数量为1)为438题,两解以上的题目(解的数量大于等于2)共有924题。

进一步我们可以将解最多的2种情况找出来,它们可能就是最简单、最容易想到答案的24点的题目了。

如下找到了解最多的2种情况,分别是{1,1,11,13} 和{1,5,7,12},它们可以排出23和22中解题的表达式。

3.3

难度性(从计算观点:难度分级)

计算角度:根据排列组合的可行解表达式,它们获得正确解所涉及的运算的复杂度和数值计算的复杂度,对题目的难易程度进行分级。

第一类难度系数:

运算符号的难度量化,指运算过程是否仅涉及加法(+)和减法(-),它们相对容易,此外是否还是或仅涉及乘法 (*) 和除法(/),它们相对复杂。或者是否还涉及四则运算的混合计算,这种情况更复杂些;

第二类难度系数:

计算过程中所涉及数和数值的难度量化,指过程数值的大小,如已知的输入数是否为11-13的两位数,中间计算过程是否涉及如81以上较大的二位数,甚至是三位数;

第三类难度系数:

过程数值类型的难度量化,指过程数值的类型,是否全是整数,还是包含有小数或分数。

感兴趣的读者可以自行尝试对所有24点根据以上难度系数进行定义,随后权重评估,给出每一题的难度系数评估值。

3.4

拓展性

更多扑克的计算游戏(Krypto)

提问8:在中国我们用4张扑克算24点,那么是否还可以用5张或6张扑克做数学游戏呢?

其实在邻国日本有一种类似的数学游戏叫"Krypto"(超人游戏),采用5个数字,数值范围从1-25,仍采用基本二元运算符*, /, +, -,计算目标点数18。

如下简单地评估 Krypto的计算规模,详细的解题方法读者可参考文献[4]和[5]。根据已知条件,采用5个数字,数值范围从1-25,采用二项式系数公式,那么总共有118755组问题。

更多数字的计算游戏(Knuth)

如文献[3] 译者序中,Knuth 高纳德教授考量译者,提出了更多数字的有趣题目。用 1-9 共9个数字按顺序排列,中间添上二元运算符,如何使排列出的表达式正好等于100,如1+2*3+4*5-6+7+8*9=100

如果允许使用括号,那么可以有  (1+2-3-4)*(5-6-7-8-9)=100

如果允许多位数直接连在一起,那么可以有  (1/(2-3+4))*567-89=100

如果允许使用小数点,那么还可以有 (.1-2-34*.5)/(.6-.789)=100

其实,这是一系列复杂度逐步增加的组合数学题,感兴趣的读者可以尝试解题,发现更多有趣的结果。

3.5

人机解题

有一些爱好者喜欢提"巧算24点"的说法,在作者看来用计算机解题并不算太"巧",它的实质是一种遍历算法或暴力算法 (Brute-Force)。不过相对而言,算法设计也有好坏,好的算法计算更完整,算法更干净,没有遗漏、也没有多余。

此外,也有读者会提出这样的问题"计算机求解能否帮助人进行解题和训练"?这是一个很有趣的问题,早在深蓝和卡斯帕罗夫的国际象棋人机大战中,卡斯帕罗夫就已经采用计算机辅助进行训练了。

对于24点的辅助功能,如能否一眼就看出一道题是否有解或无解?是否能从计算机解题过程和结果中找到或提炼规律或模式?至少作者没有找到明显的规律,但统计上讲还是有些规律。如果4张牌组中有2张以上数字是重复的,那么它无解的可能性会高很多。诸如此类的问题,感兴趣的读者也可以自行研究,一探究竟。

4. 教学相长

为培养孩子们对数学的兴趣,学会正确地表达数学,作者作为一名父亲为女儿们重新发明了一套专用的24点游戏扑克和答案手册。它基于Wolfram Mathematica 开发,可称为"表达式24点"。孩子们在游戏中主动学习、练习运算和表达数学,适合6至96岁各年龄人群。

4.1

重新表达

游戏规则:

1. 任意选择4张数字牌 (数值范围从1到13),举例如下2358;

2. 使用3张四则运算牌,如加法(+),减法 (-),乘法 (*) 和除法(/);

3. 可使用成对的括号牌( ) 来设定计算的优先级;

4. 看谁先正确获得目标点数24,并排出下列计算横式。

教学目的:

1. 数学表达:数学被喻为上帝的语言,数学家们就是通过数字和数学符号来表达其数学思想。孩子们通过无声地放置和操作扑克牌的排列形成一个或多个数学表达式计算24点,让孩子们练习和掌握数学表达。

2. 汉语表达:通过有声地采用汉语(听说读写)来表达24点的计算过程,让孩子们学会运用汉语表达计算过程和数学思想。

3. 英语表达:通过有声地采用英语(听说读写)来表达24点的计算过程,让孩子们学会运用英语表达计算过程和数学思想。

孩子们不仅要熟练使用1-100以内数字的英语单词,而且要学会四则运算等数学符号的单词,并构造完整的句子正确地表达其思想。

4.2

扑克设计

本幅游戏牌称之为"表达式24点",共有55张,包括黑色数字牌39张,红色运算符号牌10张,蓝色括号牌4张,紫色等号牌1张和目标牌24点1张。

4.3

封面词云

根据24点标准型问题1820题牌组所有正确的表达式中:数字字符0-9 ;四则运算符号 ➕➖✖️➗;小括号 ( ) 及等号 = 的使用频率,生成如下词云作为24点游戏的封面设计。

4.4

答案手册

您和您的孩子在游戏过程中可能一时难以找到正确答案,可查阅《答案手册》,因为有些题目会有多种解题方法,另一些题目则可能是无解的,约25%的题目就是无解的。查阅方法将4张数字牌按由小到大的顺序排序,如2358。随后依此顺序查阅《答案手册》中方框中的数字,在第31页可以找到2358算24点,共有3种正确的解题答案。

原文发布于微信公众号 - WOLFRAM(WolframChina)

原文发表时间:2019-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券