2015-10-23 30 views
1

我想編寫一個過程,將一個流(數據流)中的項目重新排列爲由另一個流(訂單流)指定的順序,該順序由指定所需順序的項目編號組成。在Racket中重新排序流

例如,如果數據流以4,13,2,8開始,並且訂單流以3,1,4,2開始,則結果流將以2,4,8,13開始。(結果的第一項是數據的第三個項目,結果的第二項是數據的第一個項目,依此類推。)

到目前爲止我有...

(define (reorder order-stream data-stream) 
    (cond ((stream-null? order-stream) the-empty-stream) 
      ((stream-null? data-stream) the-empty-stream) 
      (else (cons-stream (stream-ref order-stream data-stream)))) 


(define (stream-ref s n) 
    (if (= n 0) 
     (stream-car s) 
     (stream-ref (stream-cdr s) (- n 1)))) 

但是,輸出並不如預期。

+1

'stream-ref'接受流's'和索引'n',但是你用'data-stream'調用它。另外,'cons-stream'只有一個參數,這是令人驚訝的。 – coredump

回答

1

使用球拍流。

注意

(stream-ref data-stream (stream-first order-stream)) 

將使用順序流的第一個元素,以挑選出的數據流的一個元素。

還要注意,除非數據流支持隨機存取,否則我們會很慢。

#lang racket 
(require racket/stream) 

(define (reorder order-stream data-stream) 
    (cond ((stream-empty? order-stream) empty-stream) 
     (else (stream-cons (stream-ref data-stream (stream-first order-stream)) 
          (reorder (stream-rest order-stream) data-stream))))) 


(define ones (stream-cons 1 ones)) 

(define (stream-add s1 s2) 
    (stream-cons (+ (stream-first s1) (stream-first s2)) 
       (stream-add (stream-rest s1) (stream-rest s2)))) 

(define fibonacci (stream-cons 1 (stream-cons 1 (stream-add fibonacci (stream-rest fibonacci))))) 
(for/list ([x fibonacci] [n 10]) x)     ; '(1 1 2 3 5 8 13 21 34 55) 
(for/list ([x (reorder '(3 1 4 2 10) fibonacci)]) x) ; '(3 1 5 2 89) 
+0

但是,如果我執行(重新排序訂單數據),我只能獲得輸出(2.#)。我在程序中犯了什麼錯誤嗎?如何正確輸出輸出流? –