Chapter 3 习题 (Exercises)

  1. 用箱子表示法表示以下列表:
  1. (a) (a b (c d))
  2. (b) (a (b (c (d))))
  3. (c) (((a b) c) d)
  4. (d) (a (b . c) d)
  1. 写一个保留原本列表中元素顺序的 union 版本:
  1. > (new-union '(a b c) '(b a d))
  2. (A B C D)
  1. 定义一个函数,接受一个列表并返回一个列表,指出相等元素出现的次数,并由最常见至最少见的排序:
  1. > (occurrences '(a b a d a c d c a))
  2. ((A . 4) (C . 2) (D . 2) (B . 1))
  1. 为什么 (member '(a) '((a) (b))) 返回 nil?
  2. 假设函数 pos+ 接受一个列表并返回把每个元素加上自己的位置的列表:
  1. > (pos+ '(7 5 1 4))
  2. (7 6 3 7)

使用 (a) 递归 (b) 迭代 (c) mapcar 来定义这个函数。

  1. 经过好几年的审议,政府委员会决定列表应该由 cdr 指向第一个元素,而 car 指向剩下的列表。定义符合政府版本的以下函数:
  1. (a) cons
  2. (b) list
  3. (c) length (for lists)
  4. (d) member (for lists; no keywords)

勘误: 要解决 3.6 (b),你需要使用到 6.3 节的参数 &rest

  1. 修改图 3.6 的程序,使它使用更少 cons 核。 (提示:使用点状列表)
  2. 定义一个函数,接受一个列表并用点状表示法印出:
  1. > (showdots '(a b c))
  2. (A . (B . (C . NIL)))
  3. NIL
  1. 写一个程序来找到 3.15 节里表示的网络中,最长有限的路径 (不重复)。网络可能包含循环。

脚注

[3]这个叙述有点误导,因为只要是对任何东西都不返回 nil 的函数,都不是正规列表。如果给定一个环状 cdr 列表(cdr-circular list),它会无法终止。环状列表在 12.7 节 讨论。
[4]12.3 小节会展示更有效率的队列实现方式。
[5]事实上,我们有一种方式来存取列表。全局变量 , , 以及 总是设定为最后三个顶层所返回的值。这些变量在除错的时候很有用。