我是Lisp方言的初学者,我正在尝试实现一个函数sum-vector,它以两个数字向量作为参数,并返回一个向量与输入向量的对应元素之和。
我试过下面的代码,但是我想不出如何将两个不同长度的向量相加。这是我目前的代码
#lang scheme
(define sum-vector
(lambda (vec-1 vec-2)
(let* ((len (vector-length vec-1))
(result (make-vector len)))
(do ((index 0 (+ index 1)))
((= index len) result)
(vector-set! result index
(+ (vector-ref vec-1 index)
(vector-ref vec-2 index)))))))
(sum-vector (vector 4 6 8 3) (vector 5 6 7))当我运行上面的代码时,它非常适合具有相同长度的向量,例如(sum-vector (vector 4 6 8) (vector 5 6 7))返回#(9 12 15),我希望它对不同的长度类似工作,例如(sum-vector (vector 4 6 8 3) (vector 5 6 7))应该返回#(9 11 15 3),但是我不知道这样做的逻辑。
发布于 2022-04-19 12:28:48
一个可能的解决方案是在每个向量中添加零,使其长度相等,然后使用vector-map。
(define (zero-vector len)
(make-vector len 0))
(define (append-zeros vec max-len)
(vector-append vec (zero-vector (- max-len (vector-length vec)))))
(define (sum-vector v1 v2)
(let ((max-len (max (vector-length v1)
(vector-length v2))))
(vector-map +
(append-zeros v1 max-len)
(append-zeros v2 max-len))))测试:
> (sum-vector (vector 1 2 3) (vector 1 2 3 4 5 6))
'#(2 4 6 4 5 6)
> (sum-vector (vector) (vector 1 2 3 4 5 6 7 8))
'#(1 2 3 4 5 6 7 8)发布于 2022-04-22 02:36:44
另一种球拍特有的方式。
球拍有一个叫做理解的东西,它允许在容器上进行简单的迭代。特别是,for/vector返回结果的向量:
> (define v1 (vector 4 6 8 3))
> (define v2 (vector 5 6 7))
> (for/vector ([e1 v1] [e2 v2]) (+ e1 e2))
'#(9 12 15)注意,得到的向量是被迭代的最短容器的长度。但是,您可以告诉它生成一个给定长度的向量:
> (for/vector #:length (vector-length v1) ([e1 v1] [e2 v2]) (+ e1 e2))
'#(9 12 15 0)它用0填充额外的元素。将其与vector-copy!相结合,在给定的偏移量下,将一系列元素从一个向量复制到另一个向量,以便将额外的元素从较大的向量复制到较小的向量(如果它们的长度相同,则不做任何操作),您就可以得到:
(define (sum-vector v1 v2)
(let ([sum-helper
(lambda (short long)
(let ([result (for/vector #:length (vector-length long)
([e1 short] [e2 long])
(+ e1 e2))])
(vector-copy! result (vector-length short)
long (vector-length short) (vector-length long))
result))])
(if (< (vector-length v1) (vector-length v2))
(sum-helper v1 v2)
(sum-helper v2 v1))))示例:
> (sum-vector (vector 4 6 8 3) (vector 5 6 7))
'#(9 12 15 3)
> (sum-vector (vector 1 2 3) (vector 1 2 3 4 5 6))
'#(2 4 6 4 5 6)
> (sum-vector (vector) (vector 1 2 3 4 5 6 7 8))
'#(1 2 3 4 5 6 7 8)https://stackoverflow.com/questions/71924497
复制相似问题