Vector 我使用向量集实现的方案有什么问题?
我想知道我在向量集上做错了什么Vector 我使用向量集实现的方案有什么问题?,vector,scheme,lisp,racket,normalization,Vector,Scheme,Lisp,Racket,Normalization,我想知道我在向量集上做错了什么 (define foo0 (lambda (vec) (let* ((newvec (vector vec)) (l (vector-length vec)) (norm (norm0 vec))) (do ((i 0(+ i 1))) ((= i l)) (vector-set*! newvec i (/(vector-ref vec i) nor
(define foo0
(lambda (vec)
(let* ((newvec (vector vec))
(l (vector-length vec))
(norm (norm0 vec)))
(do ((i 0(+ i 1)))
((= i l))
(vector-set*! newvec i (/(vector-ref vec i) norm))) newvec)))
我试图将向量的每个元素设置为除以范数(来自另一个谓词的整数)
我经常犯的错误是
vector-set!: index is out of range
index: 1
valid range: [0, 0]
vector: '#(3/4)
因此我找到了第一个解决方案,然而,
newvec
被重置为大小1,因此索引超出了范围 在程序的第二行,编写(vector vec)
。这算什么?在程序的第二行,您编写(向量向量向量)
。这个计算结果是什么?向量
将元素作为参数生成可变向量,因此:
(vector 4) ; a vector of one element
(vector 1 2 3) ; a vector of 3 elements
让我们假设你需要一个20元素的向量,你将要变异并使用它。使用vector
是不可能的,因为那时你必须有20个伪参数。而是使用make vector
它包含两个参数,大小和所有元素的可选初始值:
(make-vector 20 0)
; ==> #(0 0 ... 0), a vector of 20 elements, all 0
现在,您可以通过
向量长度
获得传递向量的长度,您可以将其传递到生成向量
以生成与复制值相同大小的向量以生成浅拷贝。但是,通过使用向量
可以更轻松地将给定的元素作为参数生成可变向量,因此:
(vector 4) ; a vector of one element
(vector 1 2 3) ; a vector of 3 elements
让我们假设你需要一个20元素的向量,你将要变异并使用它。使用vector
是不可能的,因为那时你必须有20个伪参数。而是使用make vector
它包含两个参数,大小和所有元素的可选初始值:
(make-vector 20 0)
; ==> #(0 0 ... 0), a vector of 20 elements, all 0
现在,您可以通过
向量长度
获得传递向量的长度,您可以将其传递到生成向量
以生成与复制值相同大小的向量以生成浅拷贝。但是,通过使用您可以更轻松地执行此操作,代码的格式非常奇怪。出了什么问题?@RainerJoswig这是我的第一篇帖子,我很抱歉。你的代码格式非常奇怪。出了什么问题?@RainerJoswig这是我的第一篇帖子,我很抱歉。向量和列表有什么区别?@naomik向量在其他语言中通常称为数组,通常是固定长度的O(1)访问,而列表是单链接列表。常见的Lisp既有向量也有数组,不同之处在于数组可以是动态大小和多维的。@Sylvester我使用了(vector copy vec)而不是(vector vec),效果非常好!我现在得到了我想要的解决方案。非常感谢!向量和列表有什么区别?@naomik向量在其他语言中通常称为数组,通常是固定长度的O(1)访问,而列表是单链接列表。常见的Lisp既有向量也有数组,不同之处在于数组可以是动态大小和多维的。@Sylvester我使用了(vector copy vec)而不是(vector vec),效果非常好!我现在得到了我想要的解决方案。非常感谢!