Chapter 5 练习 (Exercises)
- 将下列表达式翻译成没有使用
let
与let*
,并使同样的表达式不被求值 2 次。
(a) (let ((x (car y)))
(cons x x))
(b) (let* ((w (car x))
(y (+ w z)))
(cons w y))
- 使用
cond
重写 29 页的mystery
函数。(译注: 第二章的练习第 5 题的 (b) 部分) - 定义一个返回其实参平方的函数,而当实参是一个正整数且小于等于 5 时,不要计算其平方。
- 使用
case
与svref
重写month-num
(图 5.1)。 - 定义一个迭代与递归版本的函数,接受一个对象 x 与向量 v ,并返回一个列表,包含了向量 v 当中,所有直接在
x
之前的对象:
> (precedes #\a "abracadabra")
(#\c #\d #\r)
- 定义一个迭代与递归版本的函数,接受一个对象与列表,并返回一个新的列表,在原本列表的对象之间加上传入的对象:
> (intersperse '- '(a b c d))
(A - B - C - D)
- 定义一个接受一系列数字的函数,并在若且唯若每一对(pair)数字的差为一时,返回真,使用
(a) 递归
(b) do
(c) mapc 与 return
- 定义一个单递归函数,返回两个值,分别是向量的最大与最小值。
- 图 3.12 的程序在找到一个完整的路径时,仍持续遍历伫列。在搜索范围大时,这可能会产生问题。
(a) 使用 catch 与 throw 来变更程序,使其找到第一个完整路径时,直接返回它。
(b) 重写一个做到同样事情的程序,但不使用 catch 与 throw。
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .