2025-2026学年SCHEME语言教案_第1页
2025-2026学年SCHEME语言教案_第2页
2025-2026学年SCHEME语言教案_第3页
2025-2026学年SCHEME语言教案_第4页
2025-2026学年SCHEME语言教案_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025-2026学年SCHEME语言教案课题:XX科目:XX班级:XX年级课时:计划1课时教师:XX老师单位:XX一、教材分析一、教材分析本教案基于2025-2026学年高中信息技术选修教材《编程基础与算法初步》中“函数式编程入门”章节,围绕SCHEME语言的核心特性展开。教材以函数定义、递归调用、基本数据类型(数、表)为逻辑主线,通过“从简单到复杂”的编排,引导学生理解函数式编程“无副作用、高阶函数”的思想。内容与课本第3章“函数与递归”、第4章“表处理”紧密关联,旨在帮助学生通过SCHEME语言实践,巩固函数抽象、递归思维等编程基础,为后续算法学习奠定逻辑基础,符合高中生认知规律与教学实际需求。二、核心素养目标二、核心素养目标本章节旨在培养学生计算思维中的抽象意识与逻辑推理能力,通过SCHEME函数定义与递归调用,提升问题分解与算法设计素养;强化信息意识,理解函数式编程“无副作用”特性对程序稳定性的价值;发展数字化学习与创新素养,运用表处理技术实现数据抽象与结构化操作;渗透信息社会责任,强调代码规范与逻辑严谨性,形成负责任的编程态度,呼应新教材“编程思想与实践融合”的核心导向。三、教学难点与重点三、教学难点与重点1.教学重点,①函数定义的语法规则与lambda表达式应用,②递归思想在数列计算与问题分解中的实现,③表的基本操作(car、cdr、cons)与结构化数据处理。2.教学难点,①递归调用的执行过程与栈帧理解,②高阶函数(map、filter)的抽象思维与应用场景转换,③嵌套表的遍历与递归处理逻辑构建。四、教学方法与策略四、教学方法与策略1.教学方法,采用项目导向学习结合案例研究,以课本"递归计算斐波那契数列"案例为起点,引导学生通过函数定义解决实际问题;融入讲授法解析lambda表达式语法规则。2.教学活动,设计"递归迷宫寻路"实验,学生分组用SCHEME实现路径规划算法;组织"表处理擂台赛",运用car/cdr/cons完成数据结构转换任务。3.教学媒体,使用DrRacket交互环境实时验证代码,结合在线评测平台(如LeetCodeScheme版)强化逻辑训练,配套思维导图工具梳理递归调用链。五、教学过程(一)情境导入,激发兴趣(5分钟)

同学们,今天我们要学习一种全新的编程思维方式——函数式编程,而SCHEME语言正是函数式编程的典型代表。请大家先看一个数学问题:斐波那契数列中,第5个数是多少?(学生回答:5)那如果让你用程序计算第100个数呢?用我们之前学的循环结构可能需要很多行代码,但今天我们将用SCHEME的递归特性,只需几行代码就能解决。翻开课本第3章,我们一起探索函数式编程的奥秘。

(二)函数定义:构建程序的基本模块(15分钟)

在SCHEME中,函数是“一等公民”,我们可以像使用数据一样使用函数。课本第3.1节告诉我们,函数定义的基本语法是`(define(函数名参数)函数体)`。比如,计算一个数的平方,我们可以这样写:`(define(squarex)(*xx))`。现在请大家动手试试,定义一个计算圆面积的函数,参数是半径,圆周率取3.14。(学生操作,老师巡视)

很好,我看到有的同学写出了`(define(arear)(*3.14(*rr)))`。但函数式编程强调“无副作用”,这意味着函数除了返回值外,不应该改变任何外部状态。比如,我们不应该在函数体内使用全局变量,大家能理解吗?(学生点头)接下来,我们学习更灵活的`lambda`表达式,课本第3.2节提到,`lambda`可以创建匿名函数,比如`(lambda(x)(*xx))`就是一个没有名字的平方函数。我们可以把它赋值给变量:`(definesquare(lambda(x)(*xx)))`,这样调用时直接用`(square5)`即可。现在请大家用`lambda`定义一个计算两数之和的函数,并尝试调用它。(学生操作,老师点评语法错误)

(三)递归调用:函数式编程的核心思想(20分钟)

递归是函数式编程的灵魂,课本第3.3节用“阶乘”的例子解释了递归的本质:函数调用自身,直到达到基例(停止条件)。阶乘的数学定义是:`n!=n*(n-1)!`,且`0!=1`。在SCHEME中,我们可以这样实现:

```scheme

(define(factorialn)

(if(=n0)

1

(*n(factorial(-n1)))))

```

现在我们一起分析这段代码:当`n=0`时,返回1(基例);否则返回`n*factorial(n-1)`(递归例)。请大家用DrRacket运行`(factorial5)`,看看结果是多少?(学生回答:120)

但递归有一个关键问题:栈溢出。比如计算`(factorial10000)`,程序可能会因为递归层次太深而崩溃。课本第3.4节告诉我们,尾递归可以优化这个问题。什么是尾递归?就是递归调用是函数的最后一步操作。比如,我们可以用“累加器”的方式改写阶乘函数:

```scheme

(define(factorial-tailnacc)

(if(=n0)

acc

(factorial-tail(-n1)(*nacc))))

```

初始调用时,`(factorial-tail51)`,每一步将`n`乘到`acc`上,直到`n=0`时返回`acc`。现在请大家运行`(factorial-tail100001)`,看看是否还会溢出?(学生发现程序正常运行)这就是尾递归的优势!

(四)表处理:函数式编程的数据结构(20分钟)

SCHEME中的“表”(List)是最重要的数据结构,课本第4章详细介绍了表的基本操作。表用括号表示,比如`'(123)`是一个包含三个元素的表。提取表头的操作是`car`,提取表尾的操作是`cdr`,比如:

-`(car'(123))`→1

-`(cdr'(123))`→`(23)`

用`cons`可以将元素插入表头,比如`(cons0'(123))`→`(0123)`。

现在请大家完成一个任务:用`car`、`cdr`、`cons`实现表的翻转。比如`'(123)`翻转后是`'(321)`。(学生分组讨论,老师提示:递归基例是空表`'()`,递归例是`(cons(lastlist)(reverse(butlastlist)))`)

很好,有的同学写出了这样的代码:

```scheme

(define(reverselst)

(if(null?lst)

'()

(cons(lastlst)(reverse(butlastlst)))))

```

但`last`和`butlast`不是基本操作,我们需要用`car`和`cdr`实现它们。比如`butlast`可以这样写:`(define(butlastlst)(cdr(reverse(reverselst))))`,虽然绕,但能理解递归思想。接下来,我们学习课本第4.3节的高阶函数,比如`map`,它可以对一个表的每个元素应用函数,比如`(mapsquare'(123))`→`(149)`。现在请大家用`map`计算`'(1234)`中每个元素的立方。(学生操作,老师点评)

(五)学生实验:递归迷宫寻路(30分钟)

现在进入实战环节!课本第4章的“迷宫寻路”案例要求我们用递归算法找到从起点到终点的路径。请大家打开DrRacket,输入课本提供的迷宫数据结构(用二维表表示,0表示可走,1表示墙),然后完成`find-path`函数,参数是当前位置`(x,y)`和目标位置`(target-x,target-y)`,返回路径表。

老师提示:递归基例是当前位置等于目标位置,返回`'((xy))`;递归例是尝试四个方向(上、下、左、右),如果某个方向可走且未访问过,则递归调用`find-path`,并将结果与当前位置合并。现在开始操作,遇到问题可以举手。(学生分组实验,老师巡视指导)

我看到第三组的同学遇到了“重复访问”的问题,导致栈溢出。课本第4.4节告诉我们,可以用“已访问表”来避免重复访问。比如在函数参数中加入`visited`表,每次访问新位置时将其加入`visited`,检查下一步是否在`visited`中。修改后的代码应该是:

```scheme

(define(find-pathxytarget-xtarget-yvisited)

(if(and(=xtarget-x)(=ytarget-y))

(list(listxy))

(let((next-steps(filter(lambda(pos)(and(not(memberposvisited))

(walkable?(carpos)(cadrpos))))

'((x-1y)(x+1y)(xy-1)(xy+1)))))

(if(null?next-steps)

'()

(let((path(find-path(caarnext-steps)(cadarnext-steps)

target-xtarget-y

(cons(listxy)visited))))

(if(null?path)

(find-path(cadrnext-steps)(cadrnext-steps)

target-xtarget-y

(cons(listxy)visited))

(cons(listxy)path)))))))

```

经过修改,第三组的程序终于成功输出了路径!大家要记住,递归问题中“状态管理”非常重要。

(六)难点突破:高阶函数与嵌套表处理(15分钟)

同学们,刚才的实验中,我们用到了高阶函数`filter`,它可以根据条件筛选表中的元素。比如,筛选出`'(12345)`中的偶数:`(filter(lambda(x)(=(remainderx2)0))'(12345))`→`(24)`。高阶函数的优势在于“抽象”,我们不需要写循环,只需定义“做什么”,而不是“怎么做”。

```scheme

(define(nested-sumlst)

(if(null?lst)

0

(if(list?(carlst))

(+(nested-sum(carlst))(nested-sum(cdrlst)))

(+(carlst)(nested-sum(cdrlst))))))

```

现在请大家用`nested-sum`计算`'((12)(3(45))6)`的和,应该是多少?(学生回答:21)完全正确!

(七)总结提升,布置作业(5分钟)

同学们,今天我们学习了SCHEME语言的函数定义、递归调用和表处理,掌握了函数式编程的核心思想:无副作用、递归、高阶函数。这些思想不仅能让我们写出更简洁的代码,还能培养我们的逻辑思维和抽象能力。课后请大家完成两个任务:1.用SCHEME实现课本第4章的“表排序”算法(用递归和`map`);2.在LeetCodeScheme版上提交“斐波那契数列”的尾递归实现。下节课我们将点评大家的作业,并探讨函数式编程在实际项目中的应用。下课!六、学生学习效果六、学生学习效果通过本章节的学习,学生全面掌握了SCHEME语言的核心知识点,包括函数定义语法规则、递归调用机制、表操作基本指令以及高阶函数应用。在知识掌握方面,学生能够准确运用define和lambda表达式定义函数,如实现圆面积计算函数(define(arear)(*3.14(*rr))),并理解无副作用特性对程序稳定性的影响。学生深刻理解递归思想,能够分解问题为基例和递归例,成功实现阶乘函数(define(factorialn)(if(=n0)1(*n(factorial(-n1)))),并通过尾递归优化技术解决栈溢出问题,如改写为(define(factorial-tailnacc)(if(=n0)acc(factorial-tail(-n1)(*nacc)))。在表处理方面,学生熟练应用car、cdr、cons指令操作数据结构,如提取表头(car'(123))返回1,构建新表(cons0'(123))生成(0123),并能实现表翻转算法(define(reverselst)(if(null?lst)'()(cons(lastlst)(reverse(butlastlst)))),结合高阶函数如map和filter处理数据,如(mapsquare'(123))输出(149)。技能提升效果显著,学生具备独立编程解决实际问题的能力,如在DrRacket环境中实现斐波那契数列递归版本,并通过尾递归优化处理大数计算;在迷宫寻路实验中,学生运用递归算法和状态管理技术,成功找到从起点到终点的路径,如修改find-path函数加入visited表避免重复访问。学生还能处理嵌套表结构,如用nested-sum函数计算'((12)(3(45))6)的和为21,体现数据抽象能力。思维发展方面,学生计算思维得到强化,能够抽象问题本质,如将数列计算转化为递归模型;逻辑推理能力提升,在调试递归调用链时分析栈帧执行过程,如理解factorial(5)的调用栈;抽象思维增强,通过高阶函数map实现数据批量处理,无需编写循环代码。实践能力尤为突出,学生通过分组实验完成“递归迷宫寻路”任务,运用car/cdr/cons指令遍历迷宫数据结构,并在LeetCodeScheme版提交作业,如斐波那契尾递归实现获得通过。在情感态度上,学生对函数式编程产生浓厚兴趣,主动探索lambda表达式灵活性;理解代码规范重要性,如避免全局变量使用,形成负责任的编程态度;通过项目导向学习,培养团队协作精神,如在表处理擂台赛中合作完成数据转换任务。整体而言,学生达到课本第3章和第4章要求,能将理论知识应用于实践,为后续算法学习奠定坚实基础。七、内容逻辑关系①函数定义是基础语法核心,课本3.1节define语法`(define(函数名参数)函数体)`与3.2节lambda表达式`(lambda(参数)函数体)`是关键知识点,函数作为一等公民是函数式编程的基石,学生需先掌握函数创建规则,才能理解后续递归调用机制。

②递归调用是思想主线,课本3.3节阶乘案例`n!=n*(n-1)!`的数学定义和3.4节尾递归优化`(if(=n0)acc(factorial-tail(-n1)(*nacc)))`是核心句,递归贯穿数列计算、表翻转、迷宫寻路等所有应用场景,体现函数式编程“自调用”的本质逻辑。

③表处理是数据应用载体,课本4章car`(car'(123))`、cdr`(cdr'(123))`、cons`(cons0'(123))`基本操作与高阶函数map`(mapsquare'(123))`、filter`(filtereven?'(1234))`是重点知识点,表作为SCHEME主要数据结构,将函数抽象与递归思想转化为可执行代码,实现从理论到实践的落地。八、课后作业八、课后作业1.用define定义函数计算圆的周长,参数为半径,圆周率取3.14,调用示例:(circumference5)→31.4。答案:(define(circumferencer)(*23.14r))。2.实现递归函数计算1到n的和,基例n=0时返回0,递归例返回n+sum(n-1),调用示例:(sum5)→15。答案:(define(sumn)(if(=n0)0(+n(sum(-n1)))))。3.用cons和cdr实现函数取表尾第二个元素,如(second-tail'(1234))→3。答案:(define(second-taillst)(car(cdr(cdrlst))))。4.用map和filter将表'((12)(34)(56))中每个子表的第一个元素提取并乘以2,结果为'(2610)。答案:(map(lambda(x)(*(carx)2))'((12)(34)(56)))。5.尾递归实现函数计算列表长度,参数为列表和累加器,初始调用时累加器为0,调用示例:(length-tail'(abc)0)→3。答案:(define(length-taillstacc)(if(null?lst)acc(len

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论