我正在学习矢量的工作原理。 我有两个向量,一个包含名称,另一个包含"电话号码"。我写了一个功能,显示所有姓名和所有电话号码彼此相邻:
(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"
这是正确的方法吗?有没有更好的方法呢?
答案 0 :(得分:3)
这是使用iterations and comprehensions和format strings在Racket中更简单的方法。可以说,这更加惯用,更容易理解:
(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"