方案矢量语法

时间:2013-10-11 13:34:55

标签: function vector scheme

我使用绑定的#34;向量"函数来自方案吗?

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

2 个答案:

答案 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))