2014-12-04 102 views
1

我正在學習矢量如何工作。 我有兩個向量,一個包含名稱,另一個包含「電話號碼」。我寫這顯示了所有的名字,所有的電話號碼的功能彼此相鄰:學習矢量

(define v4 (vector 'Tom 'Michael 'John 'Julia)) 
(define v5 (vector 2343 1343 2112 372637)) 

(define db (λ (n) 
      (cond 
       ((equal? (vector-length v4) n) "stop") 
       (equal? 0 (display (vector-ref v4 n)) 
       (display " ") 
       (display (vector-ref v5 n)) 
       (displayln " ") 
       (set! n (+ n 1)) 
       (db n)   
       )))) 
(db 0) 

結果是:

Tom 2343 
Michael 1343 
John 2112 
Julia 372637 
"stop" 

這是做正確的方式?有沒有更好的方法來做到這一點?

回答

3

這是一個簡單的方法在球拍,使用iterations and comprehensionsformat strings。可以說,這是更地道,更容易理解:

(define (db v1 v2) 
    (for ([name (in-vector v1)] 
     [phone (in-vector v2)]) 
    (printf "~a ~a~n" name phone)) 
    "stop") 

即使我們只使用明確的遞歸和標準程序,最好避免使用set!遞增指標,參數傳遞,而不是寫一個實現 - 包括那將要迭代的載體,就沒有必要引用全局定義:

(define (db v1 v2) 
    (let loop ((idx 0)) 
    (cond ((>= idx (vector-length v1)) "stop") 
      (else 
      (display (vector-ref v1 idx)) 
      (display " ") 
      (display (vector-ref v2 idx)) 
      (newline) 
      (loop (+ idx 1)))))) 

無論哪種方式,並假設兩個矢量具有相同的長度,它按預期工作:

(define v1 (vector 'Tom 'Michael 'John 'Julia)) 
(define v2 (vector 2343 1343 2112 372637)) 
(db v1 v2) 

Tom 2343 
Michael 1343 
John 2112 
Julia 372637 
"stop" 
+1

太棒了!謝謝! – 01egi4 2014-12-05 07:52:04