关于《算法与程序设计》之对分查算法的质疑与对策
【摘要】浙江省教育出版社普通高中课程标准实验教科书《算法与程序设计》中关于对分查算法的内容存在有明显的逻辑错误。针对课本中的疑问,如何化解学生的疑虑,引导学生学习、理解和掌握对分查算法的思想和方法,从而培养学生独立思考、不迷信教材、不迷信权威的科学学习态度和钻研精神,我们对教材中对分算法进行了补充与完善,并对《算法与程序设计》教材结构作出相应的调整。
【关键词】算法与程序设计;对分查;教材体系
浙江教育出版社出版的普通高中课程标准实验教科书《算法与程序设计》p40-p43有关对分查是这样描述的(因篇幅关系不是教材中的原文,为意思概括):
在数组中的数据是有序的,如果是增序的,是指下标越小的数组元素中存储的数据也越小,减序则相反。设数组变量d中存储了n个互不相同的数据,并且数组变量d中的数据是增序的,则有:d(1)d(m)由与①相同的理由,必须在新的范围(m+1,j)中继续查。
算法流程图如下(图1):
依照上述描述和流程图我们不难发现如下疑问:
疑问1:如果我们要查的数即是d(i)d(j)int函数与round函数,应用以上的查方法其结果将始终是0“未到,结果:0”,是错误的。
疑问2
计算中点m=i+j/2所得结果不一定的整数,当是小数时如何处理?大家都知道两自然数的和有这样几种情况:两奇数之和、两偶数之和均为偶数,它们的中点是一个整数,一个奇数与一个偶数之和为奇数,它的中点是一个小数,作为数组的下标不能是小数;
疑问3:当dmkey时,i=m+1。此结果对于当m为一整数时,结论是正确的,但当m是不是整数是时,比如m=25.5时,执行m-1j的值就应该是24.5,这样就将漏掉数组下标为24d(24)查;同样道理执行m+1时,i的值应该是24.5,同样也将泥质数组下标为24d(24)的数据的查。从而造成遗漏,使得最终结果有可能出现数据范围内有的数据查不出来。