如果获取流的前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和整数定义如下:
(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>))
答案 0 :(得分:1)
在Scheme中,
(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) ...
。
您也将此标记为球拍。据我所知the Racket documentation,它有stream-first
代替stream-car
等。出于某种原因,它似乎没有list->stream
,这可能是apply
使用stream
和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)
函数非常直接地定义。
此处位于a shorter notation。
{{1}}