Chapter 5 练习 (Exercises)

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