我正在尝试从一个列表中打印对,有点像方案中的一个子集,但有两个元素,就像这样
(1 2 3 4 5)
(((1 2)(1 3)(1 4)(1 5)(2 3)(2 4)(2 5)(3 4)(3 5)(4 5))
我写的代码不起作用
(define (subset x)
(if ( null? x) x
(map cons x (subset (cdr x)))))
这只是返回一个空列表
我更喜欢显式地编写lambda,这样可以更轻松地了解传递了哪些参数:
(define subset
(lambda (lst)
(if (null? lst)
lst
(append (map (lambda (el) (cons (car lst) el)) (cdr lst))
(subset (cdr lst)))
)))
(subset '(1 2 3 4 5))
=> ((1 . 2) (1 . 3) (1 . 4) (1 . 5) (2 . 3) (2 . 4) (2 . 5) (3 . 4) (3 . 5) (4 . 5))
编辑:以下关于地图的说明仅在某些版本的方案中有效,请阅读Sylwester对此答案的评论。
map遍历提供给它的n个列表,并应用于列表proc
中相同位置的n个元素。这意味着它可以应用的proc
次数最多不能超过最短列表的长度,但是您会不断为其提供一个空列表(从最后一个递归调用开始)。
(顺便说一句,这很简单scheme
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句