【发布时间】:2015-08-09 23:06:33
【问题描述】:
我有以下过程来创建列表中的所有素数对:
(define (prime-pairs lst)
(define (split lst pos)
(list (drop-right lst pos) (take-right lst pos)))
(define (prime-pairs-iter n acc)
(cond ((= n 0) (filter (lambda (e) (not (null? e))) acc))
(else (prime-pairs-iter (- n 1)
(let ((s (split lst n)))
(if (and (prime? (list->number (car s)))
(prime? (list->number (cadr s))))
(append s acc)
acc))))))
(prime-pairs-iter (- (length lst) 1) '()))
(完整代码:https://gist.github.com/anonymous/b8cfcb0bf021be9ef9c8)
我想要prime-pairs 做的是创建一个包含两个素数的lst 中每一对的列表。这些数字以列表格式表示,如下所示:11 将是'(1 1)。
不幸的是,当我运行此代码时,(filter (lambda (e) (not (null? e))) acc)) 似乎没有从最终结果中删除 '(),我最终得到了一长串空值和所需对的列表。
如果我使用(filter null? acc)),则会保留一个空值列表。所以反过来(过滤掉实际值)确实有效。
如何过滤掉返回列表的空值?
【问题讨论】:
-
你能举例说明这种行为吗?
-
@ScottHunter 是的,下载 OP 发布的 Gist,并在 DrRacket 实例中运行。