我使用绑定的#34;向量"函数来自方案吗?
(define (zip2 list1 list2)
(if (null? list1)
'()
(vector (vector (car list1) (car list2))
(zip2 (cdr list1) (cdr list2)))))
答案 0 :(得分:3)
我认为结果不正确。如果我们在问题中运行该过程,这就是我们得到的:
(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))
答案 1 :(得分: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))