CS 61A 2024 春季学期 作业 8
作业 8:Scheme 列表
截止时间:4 月 11 日周四 晚上 11:59
说明
下载 hw08.zip。压缩包里有一个名为 hw08.scm
的文件 (链接:hw08.scm),以及 ok
自动评分器的副本.
提交: 完成作业后,请将所有修改过的代码文件上传到 Gradescope。截止日期前可以多次提交,但只有最后一次提交会被评分。请确认在 Gradescope 上成功提交。 更多提交说明请参考实验 0。
使用 Ok: 如果您对使用 Ok 有任何疑问,请参阅 本指南。
参考资料: 您可能会发现以下参考资料很有用:
评分标准: 家庭作业根据正确性评分。每错一题扣一分。本次作业总分 2 分。
每个 Scheme 作业都包含 61A Scheme 解释器。要启动它,请在终端中键入 python3 scheme
。要加载名为 f.scm
的 Scheme 文件,请键入 python3 scheme -i f.scm
。要退出 Scheme 解释器,请键入 (exit)
。
Scheme 编辑器
所有 Scheme 作业都包含一个基于 Web 的编辑器,可以轻松运行 ok 测试并可视化环境。在终端中键入 python3 editor
,编辑器将在浏览器窗口中打开(位于 http://127.0.0.1:31415/
)。要停止运行编辑器并返回到命令行,请在启动编辑器的终端中键入 Ctrl-C
。
“运行”按钮会加载当前作业的 .scm
文件,并启动 Scheme 解释器,方便你尝试运行不同的 Scheme 表达式。
“测试”按钮会运行所有 ok 测试。如果测试失败,点击“查看案例”,再点击“调试”可以逐步调试。
推荐的 VS Code 扩展
如果您选择使用 VS Code 作为文本编辑器(而不是基于 Web 的编辑器),请安装 vscode-scheme 扩展,以便突出显示括号。
之前:
之后:
此外,61a-bot(安装说明)VS Code 扩展程序可用于 Scheme 家庭作业。该机器人也集成到 ok
中。
必做题
必做题
新手入门视频
这些视频可能会为解决此作业中的编码问题提供一些帮助。
要观看这些视频,您应该登录到您的 berkeley.edu 电子邮件。
Q1:升序
实现一个名为 ascending?
的函数,它接收一个数字列表 s
作为参数。如果列表中的数字按非降序排列,函数返回 True
,否则返回 False
。
如果列表中每个元素都大于等于它前面的元素,则该列表为非降序排列。例如...
(1 2 3 3 4)
是非降序的。(1 2 3 3 2)
不是。
提示: 内置函数
null?
用于判断参数是否为nil
。
注意:
ascending?
里的问号只是函数名的一部分,在 Scheme 语法中没有特殊含义。Scheme 习惯用问号结尾来命名返回布尔值的函数。
(define (ascending? s)
'YOUR-CODE-HERE
)
使用 Ok 解锁并测试您的代码:
python3 ok -q ascending -u
python3 ok -q ascending
Q2:我的过滤器
编写一个函数 my-filter
,它接收一个谓词函数 pred
和一个列表 s
作为参数,并返回一个新列表,其中只包含 s
中满足 pred
条件的元素。返回的列表应该保持元素在原列表中的顺序。
注意: 请不要直接调用 Scheme 内置的 filter
函数,我们需要你自己实现一个!
(define (my-filter pred s)
'YOUR-CODE-HERE
)
使用 Ok 解锁并测试您的代码:
python3 ok -q filter -u
python3 ok -q filter
Q3:交错
实现函数 interleave
,它接收两个列表 lst1
和 lst2
作为参数。interleave
函数应该返回一个新列表,这个列表由 lst1
和 lst2
的元素交替组成(也就是说,新列表的元素应该在 lst1
和 lst2
之间交替出现,并且从 lst1
的元素开始)。
如果 interleave
函数的其中一个输入列表比另一个短,那么它应该交替地从两个列表中取元素,直到其中一个列表用完为止,然后将较长列表中剩余的元素添加到新列表的末尾。
(define (interleave lst1 lst2)
'YOUR-CODE-HERE
)
使用 Ok 来解锁和测试你的代码:
python3 ok -q interleave -u
python3 ok -q interleave
Q4: No Repeats (去除重复)
实现 no-repeats
函数,该函数接受一个数字列表 s
作为输入。它会返回一个新列表,其中包含 s
中所有不重复的元素,并按照它们首次出现的顺序排列。
例如,(no-repeats (list 5 4 5 4 2 2))
的计算结果为 (5 4 2)
。
提示: 你可能会发现使用带有
lambda
过程的filter
函数来过滤重复项很有帮助。要测试两个数字a
和b
是否不相等,请使用(not (= a b))
。
(define (no-repeats s)
'YOUR-CODE-HERE
)
使用 Ok 来测试你的代码:
python3 ok -q no_repeats
Submit (提交)
通过将你编辑过的所有文件上传到 Gradescope 上对应的作业来提交本次作业。Lab 00 提供了详细的提交说明。
此外,所有没有参加大型实验课的学生都需要填写此考勤表。请每周提交此表格,无论你是否参加了实验课,即使因故缺席也需要提交。大型实验课的学生则无需填写。
Exam Practice (考试练习)
以下是一些往届学期的 Scheme 列表考试题,你可以将它们作为额外的练习。