如何仅使用cons和空列表在Racket中创建指定列表?
用
cons和空列表构建嵌套列表的正确姿势 我来帮你理清楚怎么用cons和空列表'()来构建你要的这些列表,先从你出错的第一个例子说起~
首先得记住一个核心规则:cons永远只接受两个参数——第一个是你要添加的元素(可以是单个值,也可以是另一个用cons构建的列表),第二个是你要把元素添加到的列表(或者用'()来收尾,标志列表结束)。嵌套列表的本质就是:列表里的某个元素本身又是一个完整的列表,也就是另一个cons的产物。
咱们逐个拆解你要的四个目标列表:
1. 目标:'(1 (2 (3 2)))
先拆解结构:最外层列表有两个元素——1,和(2 (3 2))。而(2 (3 2))本身又是一个列表,包含2和(3 2);(3 2)则是包含3和2的基础列表。
按照cons的规则从内到外构建:
- 先做最内层的
(3 2):(cons 3 (cons 2 '())) - 然后把它作为元素放到
2的后面,得到(2 (3 2)):(cons 2 (cons (cons 3 (cons 2 '())) '())) - 最后把
1作为第一个元素,和上面的结果组合成最外层列表:
(cons 1 (cons (cons 2 (cons (cons 3 (cons 2 '())) '())) '()))
你之前写的(cons (cons 1 (cons 2 '())) (cons 3 (cons 2 '()))),其实是把(1 2)作为第一个元素,(3 2)作为第二个元素,得到的自然是'((1 2) 3 2),和目标结构完全反了~后来的代码报错是因为你给cons传了多个参数,它只认两个,当然会报错啦。
2. 目标:'(1 2 (3 4 (5)))
结构拆解:最外层有三个元素——1、2、(3 4 (5))。内层的(3 4 (5))包含3、4、(5);(5)是单个元素的列表。
从内到外构建:
- 先做
(5):(cons 5 '()) - 然后构建
(3 4 (5)):(cons 3 (cons 4 (cons (cons 5 '()) '()))) - 最后组合最外层:
(cons 1 (cons 2 (cons (cons 3 (cons 4 (cons (cons 5 '()) '()))) '())))
3. 目标:'(((1 2 3)))
这是三层嵌套的列表:最外层是一个只有一个元素的列表,这个元素又是一个只有一个元素的列表,最内层才是(1 2 3)。
构建步骤:
- 先做最内层的
(1 2 3):(cons 1 (cons 2 (cons 3 '()))) - 把它套进一层列表:
(cons (cons 1 (cons 2 (cons 3 '()))) '()) - 再套一层最外层:
(cons (cons (cons 1 (cons 2 (cons 3 '()))) '()) '())
4. 目标:'((1 (2)) 3 4)
结构拆解:最外层有三个元素——(1 (2))、3、4。内层的(1 (2))包含1和(2);(2)是单个元素的列表。
构建步骤:
- 先做
(2):(cons 2 '()) - 然后构建
(1 (2)):(cons 1 (cons (cons 2 '()) '())) - 最后组合最外层:
(cons (cons 1 (cons (cons 2 '()) '())) (cons 3 (cons 4 '())))
最后再划个重点
- 每个完整的列表必须以
'()结尾,否则Lisp会把它识别成“点对”(dotted pair),而不是常规列表 - 嵌套列表就是把一个完整的
cons结构作为另一个cons的第一个参数(元素位置) - 永远别给
cons传超过两个参数,它天生只认两个!
内容的提问来源于stack exchange,提问作者user3569752
相关产品推荐
相关产品推荐

