转载:http://blog.sina.com.cn/s/blog_c1f95fa10102wv7q.html
原载于《中国信息技术教育》2017年第9期
江苏省大丰高级中学 庞 霞

江苏省盐城市教育科学研究院 曹恒来

一、学习者分析

本节课的教学对象为高中二年级的学生。这个阶段的学生具有很强的自主意识,具备一定的探究能力,喜欢通过自己动手实践来获得新知。多次经历从问题到程序的思考过程,在面对现有软件无法解决的问题时能够编写程序解决问题。在此之前,学生已经掌握了循环、数组、自定义函数的使用,为本课的学习做好了充分的准备。

二、学习内容分析

《用递归法解决问题》是高中选修教材《算法与程序设计》(科教版)第三章《算法的程序实现》第五小节的内容。在本课学习之前,学生已经学会了用循环的方法来解决问题,然而循环的方法往往并不会那么清晰地描述解决问题的步骤,递归法则可以非常直白地描述一个问题的求解过程,因此递归法也是最容易被想到和实现的算法。

递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了调用它自身的情况。递归是利用系统的堆栈保存函数当中的局部变量来解决问题的,因为函数调用的开销,递归常常会带来效率问题。本节课不仅要学会用递归法解决问题,更重要的是领会递归思想的精髓。递归思想是计算机学科中的核心技术思想之一,其本质反映的是一种将复杂问题简单化的思维方法。

三、学习目标

理解递归的含义,能找出递归问题中缩小问题规模的递归处理方法及递归结束条件,了解递归算法的优缺点;

能用程序实现递归算法,学会用简单模式解决复杂问题的方法;

领悟递归思想,体验递归思想在生活实际中的应用。

四、教学重难点

教学重点:分析递归结束条件及缩小问题规模的方法,递归算法的程序实现

教学难点:递归算法的程序实现

五、教学策略

呈现斐波那契数列问题,由学生比较熟悉的递推法入手,针对问题描述中的不严谨之处,引入递归定义及其关键因素——递归结束条件和缩小问题规模的递归处理。在递归的学习过程中,学生通过阅读代码、尝试模仿、归纳提炼、拓展应用等环节逐渐完成知识的内化并达到应用、迁移的目的。最后通过实践比较,让学生体验递推、递归两种方法的运行效率,并分析造成递归法运行效率低下的原因,学会辩证的看待问题。让学生在应用递归思想时逐渐形成一个意识——学习程序设计不仅仅是为了编程解决问题,更重要的是形成正确的解决问题的方法和态度。

六、教学过程

(一)呈现问题,初识递归

某电子购物平台15周年庆,特别推出了签到送积分活动。活动具体规则如下:从6月1日到6月15日,第1天、第2天签到均可领取1个积分,第3天签到可领取2个积分,第4天签到可领取3个积分,第5天签到可领取5个积分,……请问,小丽从6月1日起就坚持每天签到,那么6月15日那天她将领到多少积分?你能找出这15天每天所领积分间的关系吗?


教学设计图1 积分领取情况

观察图1,我们发现:第1天和第2天都只有1个积分,从第3天到第15天,每天领取的积分数就进入了一个重复的计算过程,也即每天领取的积分是前两天的积分之和。为了存放每天领取的积分数,我们可以定义一个数组Fib(15),该数组中,Fib(1)=1,Fib(2)=1,而从第3天开始的重复过程,可以利用循环来完成。代码如下:

Dim Fib(15) As IntegerFib(1) = 1Fib(2) = 1For i = 3 To 15Fib(i) = Fib(i - 1) + Fib(i - 2)Next iPrint Fib(15)

刚才我们计算的这一组数:1、1、2、3、5……是一个典型的斐波拉契数列,在解决这个问题的过程中,借助数组,从已知条件出发,利用循环的方式按照一定规则从前往后递推,最后得出了结论,这种解决问题的方式我们称之为递推法。然而在描述这组数时我们使用了“……”,在数学里经常看到这种写法,实际上这种写法并不科学,是数学表述中常见的不精确性。因为它的意义依赖于人对省略号的理解和共识。所以,斐波拉契数列还可以这样定义:

这种定义方式将问题分成了两种情况,其中一种可以直接求出结果;另一种是把问题分解成规模更小、与原问题相同解法的小问题。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况,我们称之为递归法。递归通常使用自定义函数的形式来实现,如此,求斐波那契数列就变成了一件极简单的事情:

Private Function Fib(ByVal n As Integer) As IntegerIf n = 1 Or n = 2 ThenFib = 1ElseFib = Fib(n - 1) + Fib(n - 2)End IfEnd Function

设计意图:循环的方法并不会那么清晰地描述解决问题的步骤,针对问题描述中的不严谨之处,给出一个较科学的定义。由斐波那契数列的定义引入递归的概念,并给出对应的递归程序代码,便于学生理解递归代码并深刻感受到递归法描述问题的简洁、直白。

(二)模仿尝试,体验递归

活动1:请大家模仿上例,分别完善程序,尝试用递归法解决下面三个问题。

(1)求阶乘。阶乘的递归定义:

Private Function f( ByVal n As Integer) As IntegerIf ThenElsef=f(n-1)*nEnd IfEnd Function

(2)计算年龄:有5个人坐在一起,小华问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁……一直问到第1个人,他说自己10岁。你能帮小华算出第5个人多少岁吗?

递归定义:

Private Function age( ByVal n As Integer) As IntegerIf  n=1 Thenage= 10ElseEnd If
End Function

(3)汉诺塔:如图2,你能借助②号杆将①号杆上的盘子移动到③号杆上而不改变盘子的次序吗?最少移动多少次?移动规则:每次只能移动一个盘子,大盘不能放置在小盘之上。


图2 汉诺塔

释疑:可将n-1个盘子进行捆绑,那么整个移动过程便“简化”为“三步”:

(1)将这n-1个盘子从①移动到②,需要hanoi(n-1)次;

(2)将剩下的最后一个大盘移动到③,需要1次;

(3)将②上的n-1个盘子移动到③,又需要hanoi(n-1)次。

因此,可通过如下的递归定义来缩小问题规模:


Private Function hanoi(ByVal n As Integer) As long

End Function

展示学生程序,调试运行并分析其缩小问题规模的递归处理办法和递归结束条件,以及函数调用方式。

设计意图:以半成品代码填空的方式,有目的地将代码的核心部分留白,引导学生从不同角度进行模仿,尝试使用递归的方法解决问题。

(三)归纳提升,认识递归

通过实践,我们可以总结出递归实现的基本模式如下(以斐波那契数列的递归程序为例):

Private Function Fib(ByVal n As Integer) As IntegerIf n = 1 Or n = 2 Then                         递归结束条件Fib = 1                                      直接求解ElseFib = Fib(n - 1) + Fib(n - 2)                缩小规模,递归处理End If
End Function

小结:(1)递归法通过自定义函数来实现;(2)函数体内通过分支来判断是否满足递归结束条件,不满足则进一步缩小规模,递归处理。

设计意图:进一步归纳总结,对所学知识进行提炼,逐步形成递归解决问题的基本模式。这种通过具体的语言、算法中发现的解决问题的规律进行提炼,更加有助于学生对知识进行内化,并能够将此规律运用于解决新的问题,从而真正达到应用、迁移的目的。

(四)实例拓展,应用递归

掌握了递归法解决问题的一般格式,学会分析递归结束条件和缩小问题规模的表达式后,我们可以利用递归法来解决一些问题了。

活动2:求两个数的最大公约数。辗转相除法,又名欧几里德算法(Euclidean algorithm),是求两个正整数的最大公约数的算法。设两数为a、b (a>b),求a和b最大公约数gcd(a,b)的步骤如下:r1=a mod b(r1≥0)。如果r1=0,则gcd(a,b)=b;如果r1<>0,则r2=b mod r1 (r2≥0)。如果r2=0,则gcd(a,b)=r1,若r2<>0,则继续用r1除以r2,……如此重复求除数与余数的余数,直到能整除为止。

递归定义:

Private Function gcd(ByVal a As Integer,b as integer) As integer

End Function

提示学生分析递归结束条件和如何缩小问题规模,注意递归函数的书写形式。

设计意图:学以致用,利用学生熟悉的数学问题以降低学习的难度。活动2与活动1相比,其难点在于函数的参数变成了两个,在学生分析问题时教师应当给予适当的引导。

(五)实验比较,再认递归

活动3:递推法和递归法的实验比较。

(1)用递推和递归分别求Fib数列的第15、25、35个数,测试大致运行的时间,比较两种算法的效率。
| 算法 | 15 | 25 | 35 |
| ------------- |:-------------? -----?
| 递推 |
| 递归 |

(2)分析原因。以Fib(5)的计算情况为例,尝试完成图3所示的调用关系,直至递归结束。


图3 Fib(5)计算中的函数调用情况

通过这幅图我们发现在程序运行过程中存在着大量重复的函数调用,且参数越小,调用次数越多。正因为大量重复的调用,递归函数的使用相当耗费计算机资源,运行效率较低。

递归法虽然运行效率较低,但它的程序结构清晰、易懂,是循环无法替代的。不仅如此,递归思想反映出的一种跳跃性的思维方法也为我们打开了解决问题的全新思路。递归思想启迪我们要善于发现事物的整体与局部间的规律,学会从不同的视角去理解问题的整体和局部。

在我们的学习、生活中也存在着很多递归思想的应用。如图4的用递归法来绘制分形图。

图4 递归分形图

在生命科学中,当以不同的放大倍数观察小肠结构时,从左到右较大的形态与较小的形态之间存在着自相似,如图5。

图5 人体小肠的自相似结构

设计意图:通过实践对比,学生感悟到递归的运行效率的问题及其运行效率低下的成因。虽然递归运行效率不高,但其跳跃性的思维方式,用简单模式解决复杂问题的思想却广泛的存在于程序设计乃至其他学科中。通过本环节,实现了基础知识到思想方法的提升。

评析:长期以来,我国中小学教育非常注重“双基”,然而,随着时代的发展和知识的激增,基础知识和基本可能很快就会老化、过时,无法构成学生未来发展的基础,反之,学生在一门课程学习中形成的相对稳定的思考问题、解决问题的思维方法和价值观——学科思维,则会伴随学生终身。起源于计算机科学的计算思维,不仅是运用计算机科学求解问题的方式,更是理解世界的方式,甚至是做事的方式、探究的方式、协作的方式,充分彰显了基础教育课程的基础性特征,从而构成了信息技术课程思想的完整体系。

作为计算思维的一种关键思想,递归首先是一种解决问题的方式,其核心是按照一定的规则不断缩小问题规模直至递归结束条件出现,关键是要从整体上把握,通过“递”把主问题分解成子问题,而“归”就是利用子问题的解逐步向上求解,根据这样的思路可以利用相对简单的方法来解决复杂的问题。本节课十分注重引导学生构造问题的递归定义,寻找到了递归定义,基本上就可以直接翻译成程序了。求斐波那契数列、阶乘和汉诺塔三个问题,由老师直接给出递归定义,而求最大公约数则在算法分析的基础上引导学生自主尝试定义递归。进而拓展到分形图的绘制,生命科学中具有分形特征的小肠结构,引导学生运用递归思想发现事物的整体与局部间的规律,体会递归思想在社会意义和教育意义上的普遍价值。

另外,程序设计具有强烈的工程属性,对同一问题常会得到许多合理而正确的不同程序。在寻找可能解决方案时,需要对各种方案做出评价和选择,对所做选择的优点和缺点应有清醒认识。这一点在递归程序设计中体现得尤为明显,递归描述的程序很容易阅读和理解,却也有一个本质性的缺陷,其中可能存在着大量的重复计算,许多学生可能认为,今天的计算机这么快,多算几次花不了多少时。通过试验,对比递推法和递归法计算不同数值斐波那契数列所耗费的时间,提高了学生对计算“复杂性”的认识。

当前,我们程序设计教学中“个性化”方法比较严重,同一个算法在不同问题中的描述往往是不同的,学生即使编写了“大量”的程序,也无法迁移到相似问题的解决过程之中。本节课通过对多个“个”别程序的归纳,形成递归解决问题的基本模式,并推广到更广泛的问题解决与应用中,这种基于模式建构的程序设计学习有助于建立良好的程序设计思维和方法,也有助于学生对知识进行内化。

(点评人:江苏省盐城市教育科学研究院曹恒来)

本文系江苏省教育科学“十二五”规划2015年度课题“基于活动理论的信息技术教学设计研究”(项目编号:D/2015/02/405)研究成果。

《用递归法解决问题》教学设计相关推荐

  1. 《带你游校园》教学设计

    <带你游校园>教学设计 --Premiere视频抠像处理 授 课 人: 崔绍青 学    科:数字视音频处理          授课班级:15软件1班 一.设计意图 四月招生季,我校计算机 ...

  2. 计算机设计校园的简要教案,(最新整理)《画出美丽的校园》教学设计

    <(最新整理)<画出美丽的校园>教学设计>由会员分享,可在线阅读,更多相关<(最新整理)<画出美丽的校园>教学设计(7页珍藏版)>请在人人文库网上搜索. ...

  3. 国培计算机音乐教学设计作业,2017国培计划教学设计

    2017国培计划教学设计 教学工作任重而道远,面对国培教学内容,希望与挑战并存.下面是学习啦小编为大家整理的2017国培计划教学设计,供大家阅读! 2017国培计划教学设计篇1 一.指导思想 以&qu ...

  4. 【php毕业设计】基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码)——校园新闻网站

    基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于php+mysql+apache的校园新闻网站设计与实现,文章末尾附有本毕业设计的论文和源 ...

  5. 大学计算机基础课程报告python-基于Python的“大学计算机基础”课程教学设计.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython 基于Python的"大学计算机基础&qu ...

  6. 计算机管理文件和文件夹的教案任务设置,信息教学设计:文件和文件夹的基本操作...

    教材分析:<文件和文件夹的基本操作>为浙江省高中信息技术教材(浙江教育出版社)第二章<操作系统>的第三.四.五节部分内容,该教材为典型的零起点教材,我根据学生的情况,对教材作了 ...

  7. android小闹钟课程设计,《小闹钟》教学设计

    <小闹钟>教学设计 作为一名为他人授业解惑的教育工作者,编写教学设计是必不可少的,借助教学设计可以提高教学质量,收到预期的教学效果.那要怎么写好教学设计呢?下面是小编整理的<小闹钟& ...

  8. 小学计算机学情分析报告,小学信息技术_重点文字图说话教学设计学情分析教材分析课后反思...

    教学设计 一.导入 师:为了弘扬传统文化,丰富校园生活,我们学校举办了一场"穿越千年,诗文校园"阅读推广活动. 活动要求选取古诗.优美散文.自写文章进行艺术加工,最终遴选出十篇文章 ...

  9. 大学计算机基础python学多久_基于Python 的“大学计算机基础”课程教学设计

    基于Python 的"大学计算机基础"课程教学设计 日期:2018-04-11 04:32 摘要 培养非计算机专业大学生的计算思维能力,在"大学计算机基础"课程 ...

  10. 计算机课具体任务驱动,计算机基础课程的任务驱动的教学设计与实践论文

    任务驱动 教学模式设计是基于多维.互动式的 (教师)主导-(学生)主体相结合 的教学设计理念.针对计算机课程在基础方面的教育,我国已经在上世纪八十年代纳入到了教育基础体系之中,经过阶段性努力,在这一方 ...

最新文章

  1. 《伟大的小细节:互联网产品设计中的微创新思维》——
  2. CG-CTF-Web-/x00
  3. python基础学习1-三元表达式和lambda表达式
  4. 快速转 TypeScript 指南
  5. idea快捷键之记录
  6. python mock接口怎么用_python接口自动化测试 - mock模块基本使用介绍
  7. html标签之间去掉空白,html – 减少两个标签之间的空白差距
  8. easymock教程_EasyMock教程
  9. 从dist到es:发一个NPM库,我蜕了一层皮
  10. 自动部署 mysql_MySQL5.7自动部署脚本(持续更新)
  11. VGG11、VGG13、VGG16、VGG19网络结构图
  12. linux万兆网卡驱动下载,Intel英特尔PCIe万兆网卡驱动5.11.3版For Linux(2021年3月5日发布)...
  13. 如何解决出现问题,你的PIN不可用,单击以重新设置PIN
  14. 2022秋招笔试备考合集——银行篇(下)|智测优聘出品
  15. android数独游戏数据库分析,基于Android实现数独游戏
  16. redis集群出现No reachable node in cluster
  17. 如何在WordPress菜单中显示图标[WordPress插件]
  18. 我国南极泰山站正式建成开站
  19. ffmpeg 安装bzlib_centos6中yum安装ffmpeg
  20. 集合竞价如何买入_老股民教你如何用集合竞价买入涨停板,散户看到就是赚到!...

热门文章

  1. 【PhotoShop基础B篇】准确控制曝光
  2. 修改导航栏的背景色和字体颜色
  3. 获取商品数据 API(商品详情、商品主图)
  4. 艾司博讯:拼多多商品讲解视频如何制作
  5. 程序员面试智力题(六)
  6. 淘宝被列入黑名单,确有其事还是另有原因
  7. 2023前端面试题------JS 面试题(2) es6
  8. 来吧 请收藏,测试工程师工作中需要的各种免费工具
  9. java如何生成api文档_api文档自动生成工具
  10. php 2038,php实现兼容2038年后Unix时间戳转换函数