Stream 双主流

Stream 双主流,stream,scheme,primes,Stream,Scheme,Primes,我想生成一个孪生素数流,这个流如下 ((3 5) (5 7) (11 13) (17 19) ...) 等等。我有一个生成素数流的函数,还有一个将它们配对在一起的函数。我困惑的是如何改变我的配对函数,使得只有孪生素数配对在一起。我的配对功能是: (define (pairs s t) (cons-stream (list (stream-car s) (stream-car t)) (interleave (stream-map

我想生成一个孪生素数流,这个流如下

((3 5) (5 7) (11 13) (17 19) ...) 
等等。我有一个生成素数流的函数,还有一个将它们配对在一起的函数。我困惑的是如何改变我的配对函数,使得只有孪生素数配对在一起。我的配对功能是:

(define (pairs s t)
    (cons-stream
        (list (stream-car s) (stream-car t))
        (interleave
            (stream-map (lambda (x) (list (stream-car s) x))
                (stream-cdr t))
            (pairs (stream-cdr s) (stream-cdr t)))))
当前,当传入相同的基本流时,我收到以下输出

((2 2) (2 3) (3 3) (2 5) (3 5) ...)

在明显的位置添加一个
(流过滤器(lambda(x)(=(((cadr x)(car x))2))。

您应该只配对相邻的素数:

然后,在所有相邻对中仅保留双胞胎对:

(define (twin primes)
  (stream-filter ...
    (stream-zip primes (stream-cdr primes))))

你的意思是在流图的地方吗?来吧,来吧,真的有机会让任何不相邻的素数成为双胞胎吗@威尔:我就知道。但通常很难知道是回答作者提出的具体问题,还是回答作者本应提出但没有提出的更大问题。在这种情况下,显而易见的答案是只需要一个素数流,而不是两个。但我并没有这样说,而是展示了如何解决作者指出的具体问题。当然,您的答案更好。@user3277752:过滤器位于函数的最外层:(define(pairs s t)(流过滤器(lambda(x)(=(((cadr x)(car x))2))(cons stream…)。但是你真的应该只使用一个基本流,而不是像威尔建议的那样使用两个。@user448810我只是错过了一些关于这个的小提示,一些关于这个的小评论…:)OP的代码自己计算素数的完全笛卡尔积,这有点过分了…:)于是我跳了起来
(define (twin primes)
  (stream-filter ...
    (stream-zip primes (stream-cdr primes))))