You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:19:07