数与图(5)——合并同类项

在上一篇文章《数与图(4)》中,我们拼写出多项式表达式,其难点在于如何处理众多可能的条件分支。本篇文章继续讨论与多项式有关的代数运算——合并同类项。

拥有初中数学基础的读者都知道合并同类项的含义:在由幂函数组成的多项式中,将底数和指数都相同的项加以合并,合并的方法是将它们的系数相加。例如:

想要通过编程来解决这样看似简单的代数问题,你会遇到出乎意料的困难。以往的数学训练追求的是解题速度,眼睛扫一眼题目,答案就可随即得出!可是,如果用这样的速度写程序,你会变得举步维艰。这里解决问题的关键是把思维的速度降下来!

我们先来做一个不插电的编程,用纯粹的思想实验来模拟一下程序解题的过程。

一、思想实验

多项式由单项式组成,那么单项式又由什么组成呢?由系数、底数和指数组成。这里假设底数只有“x”,那么我们关注的对象就是系数和指数。程序解题的过程是这样的。

  1. 找到多项式中的第一个单项式,命名为“首项”,求出并“记住”首项的系数和指数。

  2. 从第二项开始,按照从前向后的顺序遍历整个多项式,依次将其中的每一项命名为“对比项”,求出对比项的系数和指数。

  3. 比较首项及对比项的指数,如果它们的指数相同,则将它们的和(系数相加)设定为首项,删除对比项,并继续向后遍历多项式,直到遍历了所有的项。此时的首项已经是相同指数项加和的结果,其他的相同指数项已经被删除干净。

  4. 先将加和所得的首项保存为“结果”,再从原多项式中删除该项,此时的多项式又产生了新的首项,重复(1)至(4)的过程,直到多项式中所有的项都被转移到“结果”中。

  5. 显示“结果”。

从上述文字中,你是否体会到了“思维降速”的含义?所谓的降速,是把时间轴置于“放大镜”之下,仔细查看每个细小的时间点上事情的变化。

下面把上述文字用流程图表示出来,以便更接近程序语言,如图1所示。

图1 合并同类项的操作流程

我猜你已经发现了流程图与文字说明的差异,文字说明是从首项开始,而流程图是从末项开始,为什么要做这样的改变呢?

原因是这样的。对于人类而言,解题的习惯是从前往后,但是即便是从后往前,解题的思路是一样的,而且所得的结果也完全相同。但是对于程序而言,当我们处理列表时,尤其是做删除操作时,情况就变得复杂。想象一下,如果是从前向后遍历,当我们删除了一个“对比项”后,列表的长度变了(减1),对比项之后的每一项的位置都向前移动一位,那么当我们继续向后遍历时,就会错过其中的一项,就是紧邻被删除项的那一项。

在理解了上述图文内容之后,我们开始写程序。至于用户界面,非常简单,将屏幕设为横屏,添加一个按钮、一个标签即可。

二、编写程序

1、全局变量

如图2所示,这是项目中唯一的全局变量,其实是当作常量来用。注意这里我们将x的4次方直接写成“xxxx”,是为了便于简化程序,强调解决问题的方法。

图2 项目中的全局变量

2、有返回值过程

(1)求单项式的系数

如图3所示,将单项式中的字符“x”全部替换成空字符,就得到了单项式的系数。

图3 有返回值过程——系数

(2)求单项式指数

如图4所示,将单项式分解为列表,然后统计字符“x”的个数,就得到了单项式的指数。

图4 有返回值过程——指数

(3)将多项式表达式转化为多项式列表

如图5所示,先用“+”分解多项式,然后针对分解结果中包含“-”的项再进行分解,注意用“-”分解所得的项中不包含“-”,因此要为每一个原有的负系数添加减号。

图5 有返回值过程——多项式列表

(4)拼写x字串

如图6所示,当给定指数时,拼写出连续书写的指数个“x”。

图6 有返回值过程——拼x串

(5)求两个同类项之和

如图7所示,这对给定的两个同类项,分别求出它们的指数和系数,然后将系数求和,并返回结果。

图7 有返回值过程——同类项之和

(6)将多项式列表转化为多项式表达式

如图8所示,针对给定的多项式列表,将列表项拼写成多项式表达式,需要留心系数大于零时的情况。

图8 有返回值过程——多项式表达式

3、无返回值过程——合并同类项

如图9所示,这个过程综合了上述全部有返回值过程,如果你理解了前面的思想实验,想必理解这段代码不会太难。

图9 无返回值过程——合并同类项

四、事件处理程序

如图10所示,当点击按钮1时,执行合并同类项操作,并将结果显示在标签1中。

图10 按钮点击事件处理程序

三、测试

这个测试过程非常简单,点击按钮,查看运算结果,如图11所示。

图11 测试结果

注意在运算结果中,我们没有处理系数的表示方法,首项的“+2xxxx”显然应该写作“2x的4次方“(请原谅公众号编辑器不支持上标),而第二项“-1xxx”应该写作“-x的3次方”,这部分内容请读者参照《数与图(4)》自行加以处理。

四、讨论

用程序的方法解决传统的数学问题,其难点在于将我们习以为常的思路,破解为一个一个最基本的,或者说最简单的操作,然后将这些操作用程序语言表述出来。放慢思维的脚步,就可以看到这些“微观”的操作。

(0)

相关推荐