Scheme中car与cdr疑问:(car '((1 2 3) (4 5 6)))构造问题
解决Scheme习题:
(car '((1 2 3) (4 5 6)))的困惑 嘿,我来帮你把这个问题理清楚!你卡在构造目标列表和理解car的结果上,咱们一步步拆解:
1. 先搞懂目标列表((1 2 3) (4 5 6))的结构
这个列表本质是两个子列表作为元素组成的外层列表:
- 外层列表的第一个元素是子列表
(1 2 3) - 外层列表的第二个元素是子列表
(4 5 6)
你之前用的cons组合出错,问题出在第二个参数的结构上:
你写的代码是:
(cons (cons 1 (cons 2 (cons 3 '()))) (cons 4 (cons 5 (cons 6 '()))))
这里第二个参数是(4 5 6)(一个直接包含数字的列表),所以cons会把它当成外层列表的“剩余部分”,最终得到((1 2 3) 4 5 6)——这其实是((1 2 3) . (4 5 6))的简写,外层列表的元素是(1 2 3)、4、5、6,不是你想要的两个子列表结构。
2. 正确构造((1 2 3) (4 5 6))的方式
方式一:用list函数(最直观)
list函数会把所有传入的参数作为元素,直接组成一个列表,所以可以这样写:
(list (list 1 2 3) (list 4 5 6))
这里(list 1 2 3)生成子列表(1 2 3),(list 4 5 6)生成子列表(4 5 6),外层list把这两个子列表组合成目标结构。
方式二:用cons手动构造
如果非要用cons,要确保外层列表的第二个参数是包含子列表(4 5 6)的列表(也就是( (4 5 6) )),所以代码应该是:
(cons (cons 1 (cons 2 (cons 3 '()))) (cons (cons 4 (cons 5 (cons 6 '()))) '()))
这里第二个cons的第二个参数是'()(空列表),所以外层结构是(子列表1 . (子列表2 . ())),也就是标准的列表(子列表1 子列表2),正好是你要的((1 2 3) (4 5 6))。
3. 回到习题:(car '((1 2 3) (4 5 6)))的结果
car的作用是取列表的第一个元素,现在目标列表的第一个元素就是子列表(1 2 3),所以这个表达式的结果就是(1 2 3)。
内容的提问来源于stack exchange,提问作者Nicholas Humphrey
相关产品推荐
相关产品推荐

