如何从此列表中筛选空值?

时间:2015-08-09 23:06:34

标签: scheme lisp

我有以下程序在列表中创建所有素数对:

(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)),则保留空值列表。所以反过来(过滤掉实际值)确实有效。

如何过滤掉返回列表的空值?

1 个答案:

答案 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。)

相关问题