我有以下程序在列表中创建所有素数对:
(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))
,则保留空值列表。所以反过来(过滤掉实际值)确实有效。
如何过滤掉返回列表的空值?
答案 0 :(得分:2)
目前,您的prime-pairs
函数始终返回一个值:空列表或素数对。使用map
,无法避免空列表,而无需对map
的结果进行进一步过滤。
另一种方法是返回结果的列表,并使用append-map
代替map
。更改您的prime-pairs
以返回空列表,或包含素数对的单个列表;这模拟返回零或一个值,而不是总是一个值。像这样:
(cond ((zero? n) (if (null? acc)
'()
(list acc)))
...)
现在,使用append-map
:
(append-map prime-pairs primes-list-split)
你应该得到你想要的结果。 (有关完整代码,请参阅my forked gist。)