我在这里正确使用方案中的绑定“向量”函数吗?
(define (zip2 list1 list2)
(if (null? list1)
'()
(vector (vector (car list1) (car list2))
(zip2 (cdr list1) (cdr list2)))))
我不认为结果是正确的。如果我们运行问题中的过程,这就是我们得到的:
(zip2 '(1 2 3) '(4 5 6))
=> '#(#(1 4) #(#(2 5) #(#(3 6) ())))
正如你所看到的,有一些向量嵌套在向量中,比它们应该的更深。您的解决方案的问题是您不能只是替换cons
并vector
期望事情会一样;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))
是和不是。在您的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))