Scheme对输出

时间:2013-03-31 14:22:55

标签: scheme racket

如果获取流的前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>))

1 个答案:

答案 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使用streamipairs 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}}