1

我在这里正确使用方案中的绑定“向量”函数吗?

(define (zip2 list1 list2)
 (if (null? list1)
   '()
   (vector (vector (car list1) (car list2))
           (zip2 (cdr list1) (cdr list2)))))
4

2 回答 2

3

我不认为结果是正确的。如果我们运行问题中的过程,这就是我们得到的:

(zip2 '(1 2 3) '(4 5 6))
=> '#(#(1 4) #(#(2 5) #(#(3 6) ())))

正如你所看到的,有一些向量嵌套在向量中,比它们应该的更深。您的解决方案的问题是您不能只是替换consvector期望事情会一样;cons可以随时构建列表,一次添加一个元素,但要构建矢量,您需要事先了解所有元素,因为您无法在创建后添加元素。

我宁愿根据“正常”zip操作(使用列表的操作)来解决问题,然后将结果转换为向量:

(define (zip list1 list2)
  (map list list1 list2))

(zip '(1 2 3) '(4 5 6))
=> '((1 4) (2 5) (3 6))

(define (zip2 list1 list2)
  (list->vector
   (map list->vector (zip list1 list2))))

(zip2 '(1 2 3) '(4 5 6))
=> '#(#(1 4) #(2 5) #(3 6))

或等效地,但不使用zip作为解决方案的一部分:

(define (zip2 list1 list2)
  (list->vector
   (map vector list1 list2)))

(zip2 '(1 2 3) '(4 5 6))
=> '#(#(1 4) #(2 5) #(3 6))
于 2013-10-11T14:15:56.117 回答
1

是和不是。在您的if语句中,consequent返回一个列表,而alternate返回一个向量。这不太可能是正确的。例如:

> (zip2 '(a b) '(1 2))
#(#(a 1) #(#(b 2) ()))

你注意到里面了()吗?不好......但是,取决于你的确切问题,你还没有真正说明这一点。修复可能就像替换为一样'()简单'#()

[编辑] 现在我们知道您的需求。这会让你到达那里:

(define (zip2 list1 list2)
  (map vector list1 list2))

> (zip2 '(10 20) '(1 2)) 
(#(10 1) #(20 2))
于 2013-10-11T14:15:47.977 回答