Skip to main content

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 电子邮件。

YouTube 链接

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,它接收两个列表 lst1lst2 作为参数。interleave 函数应该返回一个新列表,这个列表由 lst1lst2 的元素交替组成(也就是说,新列表的元素应该在 lst1lst2 之间交替出现,并且从 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 函数来过滤重复项很有帮助。要测试两个数字 ab 是否不相等,请使用 (not (= a b))

(define (no-repeats s)
'YOUR-CODE-HERE
)

使用 Ok 来测试你的代码:

python3 ok -q no_repeats

Submit (提交)

通过将你编辑过的所有文件上传到 Gradescope 上对应的作业来提交本次作业。Lab 00 提供了详细的提交说明。

此外,所有没有参加大型实验课的学生都需要填写此考勤表。请每周提交此表格,无论你是否参加了实验课,即使因故缺席也需要提交。大型实验课的学生则无需填写。

Exam Practice (考试练习)

以下是一些往届学期的 Scheme 列表考试题,你可以将它们作为额外的练习。

  1. Fall 2022 Final, Question 8: A Parentheses Scheme
  2. Spring 2022 Final, Question 11: Beadazzled, The Scheme-quel
  3. Fall 2021 Final, Question 4: Spice