从方案列表中打印对

用户名

我正在尝试从一个列表中打印对,有点像方案中的一个子集,但有两个元素,就像这样

(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)))))

这只是返回一个空列表

尼姆罗德·莫拉格(Nimrod Morag)

我更喜欢显式地编写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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章