作业 0.3

第 0.3 课课后作业:用递归实现时间描述、remove-once、differences、location、initials 等 9 道练习。

模板

在终端输入下面的命令,把作业模板文件复制到当前目录(注意末尾的句点):

cp ~cs61as/autograder/templates/hw0-3.rkt .

或者,你可以从这里下载模板。

练习 1

为作业 0-2 中的 describe-time 过程写一个新版本。你只需要考虑到一天以内的时间段。它不应返回小数,而应这样工作:

-> (describe-time 22222)
'(6 HOURS 10 MINUTES 22 SECONDS)

-> (describe-time 550441)
'(6 DAYS 8 HOURS 54 MINUTES 1 SECONDS)

提示: 使用 quotient!

看看你能不能想办法让程序聪明到知道何时使用复数;这不是必需的。

练习 2

下面是过程 remove-once 应有的工作方式示例:

-> (remove-once 'morning '(good morning good morning))
'(good good morning)

(如果 remove-once 去掉的是另一个 “morning” 也没关系,只要只去掉其中一个就行。)

请写出 remove-once。

练习 3

写出过程 differences,它接收一个数字句子作为实参,返回一个包含相邻元素之差的句子。(返回句子的长度比实参少 1。)

-> (differences '(4 23 9 87 6 12))
'(19 -14 78 -81 6)

练习 4

写一个名为 location 的过程,接收两个实参:一个词和一个句子。它应返回一个数,指示该词能在句子的哪个位置找到。如果词不在句子中,返回 #f。如果词出现多次,返回第一次出现的位置。

-> (location 'me '(you never give me your money))
4
-> (location 'i '(you never give me your money))
#f
-> (location 'the '(the fork and the spoon))
1

练习 5

写一个过程 initials,接收一个句子作为实参,返回由句子中每个词的首字母组成的句子。

-> (initials '(if i needed someone))
'(i i n s)

练习 6

写一个过程 copies,接收一个数和一个词作为实参,返回一个包含该词指定数量副本的句子。

-> (copies 8 'spam)
'(spam spam spam spam spam spam spam spam)

练习 7

写一个 GPA 过程。它接收一个成绩句子作为实参,返回相应的平均学分绩点。

提示: 写一个名为 base-grade 的辅助过程,接收一个成绩作为实参,返回 0、1、2、3 或 4;再写一个名为 grade-modifier 的辅助过程,根据成绩含减号、加号还是两者皆无,返回 -.33、0 或 .33。

-> (gpa '(A A+ B+ B))
3.67

练习 8

写出 repeat-words,它接收一个句子作为实参。它返回一个与实参相似的句子,但如果实参中出现一个数,那么返回值中包含紧随其后的词的那么多份副本。

-> (repeat-words '(4 calling birds 3 french hens))
'(calling calling calling calling birds french french french hens)
-> (repeat-words '(the 7 samurai))
'(the samurai samurai samurai samurai samurai samurai samurai)

提示: 你不必把所有工作都放在一个过程里完成。使用辅助过程可能会有帮助。

练习 9

写一个谓词 same-shape?,接收两个句子作为实参。如果两个条件都满足,它应返回 #t:两个句子必须有相同数量的词,并且第一个句子的每个词必须与第二个句子对应位置的词有相同数量的字母。

-> (same-shape? '(the fool on the hill) '(you like me too much))
#t
-> (same-shape? '(the fool on the hill) '(and your bird can sing))
#f

提示: 原始过程 count 可能会有用。

提交作业!

相关说明请参见这份指南。它涵盖基本终端命令和作业提交。

提交时如有任何困难,请随时向助教请教!