【问题标题】:Learning vectors学习向量
【发布时间】:2014-12-04 22:56:37
【问题描述】:

我正在学习矢量是如何工作的。 我有两个向量,一个包含名称,另一个包含“电话号码”。我写了一个函数,显示所有姓名和所有电话号码并排显示:

(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"

这是正确的做法吗?有没有更好的方法?

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    这是 Racket 中一种更简单的方法,使用 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"
    

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 2017-05-17
    • 2016-03-28
    • 1970-01-01
    • 2014-07-03
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多