1

如果采用流的前 6 个元素,则尝试生成看起来像 (1 1) (1 2) (1 3) (2 2) (2 3) (3 3) 的对的输出。(前 6 列有 3 列,它应该打印以 1 开头的对,然后是 2,然后是 3。)我拥有的代码是:

(define (pairs s t)
  (cons-stream (cons (stream-car s) (stream-car t))
               (cons-stream
                (stream-map (lambda (x) (cons (stream-car s) x))
                            (stream-cdr t))
                (pairs (stream-cdr t) (stream-cdr s)))))

如果我跑

(take 6 (pairs integers integers))

其中 take 和 integers 定义如下:

(define (take n s)  
  (if (= n 0)
      '()
      (cons (stream-car s) (take (- n 1) (stream-cdr s)))))

(define integers (cons-stream 1 (add-streams ones integers))) 

我得到的结果是:

((1 . 1)
 ((1 . 2) . #<promise>)
 (2 . 2)
 ((2 . 3) . #<promise>)
 (3 . 3)
 ((3 . 4) . #<promise>))
4

1 回答 1

1

在方案中,

(define (interleaved-pairs xs ys . args)
  (let ((x (stream-car xs))
        (ac (if (null? args) () (car args))))
    (stream-append 
      (stream-map stream-car (list->stream (reverse ac)))
      (stream-cons (list x (stream-car ys))
        (interleaved-pairs 
          (stream-cdr xs)
          (stream-cdr ys)
          (cons
            (stream-map (lambda(y)(list x y)) (stream-cdr ys))
            (map stream-cdr ac)))))))

这应该按照您想要的顺序产生结果:(1 1) (1 2) (2 2) (1 3) (2 3) (3 3) (1 4) ....

您也将此标记为球拍。据我在Racket 文档中看到的,它stream-first代替了stream-car等。由于某种原因,它似乎没有list->stream,可以使用applyandstream函数非常直接地定义。


这里是一个较短的符号

ipairs xs ys = g xs ys []  where
  g (x:xs) (y:ys) ac = map head (reverse ac) ++ (x,y) : 
                         g xs ys (map ((,) x) ys : map tail ac)
于 2013-03-31T15:46:58.207 回答