【问题标题】:Twin Prime Stream双子流
【发布时间】:2014-12-04 02:26:45
【问题描述】:

我想生成一个双素数流,使得流如下

((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) ...)

【问题讨论】:

    标签: stream scheme primes


    【解决方案1】:

    在明显的位置添加(stream-filter (lambda (x) (= (- (cadr x) (car x)) 2)) ...)

    【讨论】:

    • 你的意思是代替流图吗?
    • 来吧,来吧,真的有机会,永远,任何不相邻的素数都是双胞胎吗?!??? :)
    • @Will:我知道。但通常很难知道是回答作者提出的具体问题,还是回答作者应该提出但没有提出的更大问题。在这种情况下,显而易见的答案是您只需要一个素数流,而不是两个。但我没有这么说,而是展示了如何解决作者指出的具体问题。你的答案当然更好。
    • @user3277752:过滤器位于函数的最外层:(define (pairs s t) (stream-filter (lambda (x) (= (- (cadr x) (car x)) 2))(反对流...)))。但是你真的应该只使用一个主要流,而不是像 Will 建议的那样使用两个。
    • @user448810 我只是错过了一些关于这个的小提示,关于这个的一些小评论...... :) OP 的代码计算了素数的完整笛卡尔积,它是 一点点 这里有点矫枉过正...... :) 所以我跳了起来。 :)
    【解决方案2】:

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

    (define (stream-zip s t)
        (cons-stream
            (list (stream-car s) (stream-car t))
            (stream-zip (stream-cdr s) (stream-cdr t))))
    

    那么你只保留所有相邻对中的双胞胎对:

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

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 2021-01-26
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多