Chapter 3 习题 (Exercises)
- 用箱子表示法表示以下列表:
(a) (a b (c d))
(b) (a (b (c (d))))
(c) (((a b) c) d)
(d) (a (b . c) d)
- 写一个保留原本列表中元素顺序的
union
版本:
> (new-union '(a b c) '(b a d))
(A B C D)
- 定义一个函数,接受一个列表并返回一个列表,指出相等元素出现的次数,并由最常见至最少见的排序:
> (occurrences '(a b a d a c d c a))
((A . 4) (C . 2) (D . 2) (B . 1))
- 为什么
(member '(a) '((a) (b)))
返回 nil? - 假设函数
pos+
接受一个列表并返回把每个元素加上自己的位置的列表:
> (pos+ '(7 5 1 4))
(7 6 3 7)
使用 (a) 递归 (b) 迭代 (c) mapcar
来定义这个函数。
- 经过好几年的审议,政府委员会决定列表应该由
cdr
指向第一个元素,而car
指向剩下的列表。定义符合政府版本的以下函数:
(a) cons
(b) list
(c) length (for lists)
(d) member (for lists; no keywords)
勘误: 要解决 3.6 (b),你需要使用到 6.3 节的参数 &rest
。
- 修改图 3.6 的程序,使它使用更少 cons 核。 (提示:使用点状列表)
- 定义一个函数,接受一个列表并用点状表示法印出:
> (showdots '(a b c))
(A . (B . (C . NIL)))
NIL
- 写一个程序来找到 3.15 节里表示的网络中,最长有限的路径 (不重复)。网络可能包含循环。
脚注
[3] | 这个叙述有点误导,因为只要是对任何东西都不返回 nil 的函数,都不是正规列表。如果给定一个环状 cdr 列表(cdr-circular list),它会无法终止。环状列表在 12.7 节 讨论。 |
[4] | 12.3 小节会展示更有效率的队列实现方式。 |
[5] | 事实上,我们有一种方式来存取列表。全局变量 , , 以及 总是设定为最后三个顶层所返回的值。这些变量在除错的时候很有用。 |
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .