gpt4 book ai didi

scheme - 如何从此列表中过滤空值?

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:22 24 4
gpt4 key购买 nike

我有以下过程来创建列表中的所有素数对:

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

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

最佳答案

目前,您的素数对 函数总是返回一个值:空列表或素数对。使用 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。)

关于scheme - 如何从此列表中过滤空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com