数与图(7)——求多项式的值

在上一篇《数与图(6)》中,我们实现了多项式的乘法,但是遗留了一个很重要的问题——如何验证程序的正确性呢?在这篇文章中,我们尝试给定一个x的值,用两种方法求多项式的值,即,同时将x的值带入乘积表达式:

(x+3.6)*(x+2.5)*(x+1)*(x-0.5)*(x-2)*(x-3.5)

及多项式表达式(上一篇文章的结果):

+1xxxxxx+1.1xxxxx-15.75xxxx-23.875xxx+65.875xx+57.9x-37.5

看看能否得到相同的值。

为了计算的方便,创建两个有返回值过程——多项式求积、多项式求和,代码如图1所示。

图1 有返回值过程:多项式求积与多项式求和

图1中显示了标签1的显示文本,也就是多项式乘法的题目和计算结果,如果程序没有错误,那么对于同一个x,这两个过程应该得出相同的结果,让我们来测试一下。

在连接了AI伴侣的情况下,完全可以脱离手机对程序进行测试,如图2所示。

图2 将x带入表达式求值

图2中显示的结果表明,两个过程对于同一个x,给出了不同的结果,这出乎了我的意料。显然,多项式求积的结果是不会有错的,出错的是多项式求和,而且可以断定我的程序有bug!

找bug是程序员的基本功,也是由新手成长为高手的必经之路。我盯着程序看了一会儿,猜想bug出在哪里。通常的思路是逆着程序执行的方向,从最靠接结果的地方开始查找,如图3所示。

图3 查找bug的思路

根据图3的思路,我们来实施步骤3)和步骤4),分别检查这两个过程,通常的方法是用最熟悉的数据进行测试,如(x+1)*(x+1),测试结果如图4所示。

图4 追踪错误的来源

由图4的结果推测错误发生在“合并同类项”过程里,那么事实是不是这样呢?将测试数据稍加改变,再来测试,如图5所示。

图5 将测试数据稍加改变得到不同的结果

由图5的测试结果推测,错误并非出自“合并同类项”过程,而是因为“双多项式乘积”过程给出的结果不符合要求。找到了问题的来源,就可以开始着手解决问题了。解决的办法是去掉多项式中最前面的加号。

创建一个有返回值过程——去除首项加号,代码如图6所示。

图6 有返回值过程——去掉首项加号

下面开始使用“去加号”过程,来测试此前的(x+1)*(x+1),测试结果如图7所示。

图7 运用去首项加号过程

接下来要改造此前的代码,对某些表达式实施“去首项加号”操作。首先要改造的就是“多项式乘积”过程,修改后的结果如图8所示。

图8 对输出的多项式结果实施“去首项加号”操作

值得注意的是,合并同类项过程是一个递归调用的过程,每次递归调用时,都要对中间结果作“去首项加号”操作,修改过的代码如图9所示。

图9 对递归调用过程的中间结果作“去首项加号”操作

经过上述修改,我们来测试一下结果,如图10所示。

图10 修改后程序的测试结果

我们依然不能确定这个结果就是正确的,所以下面要改造一下“多项式求和”过程,将其中的系数改为图10中的结果,并用求值法加以验证。修改后的代码及测试结果如图11所示。

图11  修改后的“多项式求和”过程及测试结果

图11显示的结果证明了我们对代码的改进是有效的。

文章写到这里,似乎已经到了尾声,完成了多项式的求值运算,并修改了原来程序中的bug,但是,我们并未对bug产生的机制进行讨论,为什么首项加号会导致合并同类项的错误,这个问题是值得思考的,希望喜欢探究的读者们自己来加以思考并找到问题的答案。

(0)

相关推荐

  • 论数学之美——欧拉及其对著名的巴塞尔问题的精确解

    被许多人认为是"自古以来最伟大的数学家"的德国数学家.天文学家和物理学家卡尔·弗里德里希·高斯曾经说过: 研究欧拉的著作将仍然是不同数学领域的最佳流派,没有任何东西可以取代它--卡 ...

  • 如何计算前n个整数的p次幂的和?证明伯努利幂和

    瑞士的伯努利家族共有八位世界著名的数学家,雅各布·伯努利(Jacob Bernoulli)便是其中之一.1713年,雅各布·伯努利提出了前n个整数的p次幂之和的表达式.他的解是n的(p+1)次多项式, ...

  • 资深游戏测试总监详解质量管理工作的9个步骤|游戏葡萄

    游戏测试就是整天玩游戏的吧? 游戏测试还要招本科毕业的!!!不是逗我的吧? 游戏测试不就是拿鼠标或手指头随便点点么? -- 本文我们尝试对上述问题作出一点点专业解释,思路脱胎于2015年笔者在公司内部 ...

  • 测试用例的设计原则

    要做好测试用例的设计,需要注意以下7个设计原则: 利用成熟的测试用例设计方法来指导设计 测试用例有很多设计方法. 黑盒测试用例设计方法包括等价类划分法.边界值分析法.错误推测法.因果图法.判定表驱动法 ...

  • 【OO学习】OO第一单元作业总结

    OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...

  • OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  • 数与图(15)——求导数

    在上篇<数与图(14)--微积分初步>中,我们介绍了微分.导数及积分的定义,有了定义,就可以根据定义推演出计算方法,本篇文章讨论导数的算法:首先用程序求解,然后给出数学上的标准解法. 在& ...

  • 数与图(18)——求积分

    在<数与图(14)>中我们给出了积分的定义:区间[x1,x2]内函数曲线与x轴之间所包围的曲边梯形面积.本文将根据这一定义,利用程序求出六次幂函数在特定区间内的积分近似值,然后再利用数学方 ...

  • 5.七年级数学下册:若多项式乘积中不含x²项,怎么求a的值?

    初中数学:若多项式乘积中不含x²项,怎么求a的值?大家先在草稿本上认真地做一遍,然后再看后面的视频.期待您在评论区留言. 温馨提醒:本<七年级数学>公众号,主要发布七年级数学上册和和下册的 ...

  • 14.七年级数学:若多项式结果中不含x³项,怎么求k的值?整式加减常考

    七年级数学:若多项式结果中不含x³项,怎么求k的值?整式加减常考.大家先在草稿本上认真地做一遍,然后再看后面的视频.期待你在评论区的留言. 温馨提醒:方老师数学课堂,因为视频内容越来越多,为了更好的分 ...

  • 13.七年级数学:若多项式x²+kx-2x+3中不含x的一次项,怎么求k的值?

    七年级数学:若多项式x²+kx-2x+3中不含x的一次项,怎么求k的值?大家先在草稿本上认真地做一遍,然后再看后面的视频.期待你在评论区的留言. 请看视频讲解,觉得不错,请点赞.

  • 数与图(4)——多项式表达式

    在数与图(3)中,我们绘制了一次函数.二次函数及三次函数的图形,接下来我们希望绘制更为复杂的函数图形,如下式: 通过改变系数的值,来观察系数对曲线形状的影响.这项任务涉及到大量的运算,对于人类来说,即 ...

  • 数与图(6)——多项式乘法

    在上一篇文章<数与图(5)>中,我们实现了合并同类项操作,而合并同类项是多项式乘法的基础,本文在此基础上,用程序实现多项式的乘法运算. 首先将上一篇文章的项目"合并同类项&quo ...

  • 八年级奥数题:分组法 因式分解法,求a的值?

    八年级奥数题:分组法 因式分解法,求a的值?

  • 7.七年级数学:若多项式是关于x、y的三次多项式,怎么求mn的值?

    七年级数学:若多项式是关于x.y的三次多项式,怎么求mn的值?大家先在草稿本上认真地做一遍,然后再看后面的视频.期待你在评论区的留言. 请看视频讲解,觉得不错,请点赞.