如何解决如何模拟嵌套循环中的收集
我想创建一个(a . b)
对与1 < a < b <= n
到n
对的列表,例如n = 5
:
((2 . 3) (2 . 4) (3 . 4) (2 . 5) (3 . 5) (4 . 5))
(对的顺序并不重要。)
我想出了代码
(defun create-pairs (upper-bound)
(loop for i from 3 to upper-bound
for j from 2 to (1- upper-bound)
collecting (cons j i)))
但这不能满足我的要求
* (create-pairs 5)
((2 . 3) (3 . 4) (4 . 5))
因为循环是同时增加的。
因此我尝试了
(defun create-pairs (upper-bound)
(loop for i from 3 to upper-bound do
(loop for j from 2 to (1- upper-bound)
collecting (cons j i))))
结果:
* (create-pairs 5)
NIL
我不记得在哪里了,但我读到不可能像第二次尝试那样在结构中使用collecting
。
那么我如何获得想要的结果?不可能用loop for
解决吗?
解决方法
您快到了-您只需accumulate内部loop
的结果:
(defun create-pairs (upper-bound)
(loop for i from 3 to upper-bound nconc
(loop for j from 2 below i
collect (cons j i))))
(create-pairs 5)
==> ((2 . 3) (2 . 4) (3 . 4) (2 . 5) (3 . 5) (4 . 5))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。