我正在尝试从仅包含数字的向量中获取最低的整数。我知道如何使用列表。您可以比较列表的前两个值,并根据哪个值较大来保存您的值以稍后输出它,或者使用 cdr 与列表的其余部分(除第一个元素外的所有元素)再次调用该函数。 strong>过程。
但是有了向量我就完全迷失了。我的猜测是,对于列表和向量,解决方案的思考方式将是相同的。我一直在读Lange-lang网站,但还没有找到解决问题的方法。我一直在尝试的过程是 vector-ref 和 vector-length ,因为它们似乎在此问题中最有用(但这是我第一次工作带有向量,所以我知道什么。)
所以我的两个问题是:
我们如何从向量中获取除第一个值以外的所有值?是否有类似 cdr 的过程,但是针对矢量?
如果要使用列表,则可以使用 cons 保存要输出的值。但是使用向量时是否有类似的方法呢?
谢谢!
答案 0 :(得分:3)
最简单的解决方案是使用名为for
的{{1}}的变体。
我以为还有for/fold
但可惜。
for/min
如果您希望使用更明确的方法:
#lang racket
(define v (vector 11 12 13 4 15 16))
(for/fold ([m +inf.0]) ([x (in-vector v)])
(min m x))
更新
(define (vector-min xs)
(define n (vector-length xs))
(let loop ([i 0] ; running index
[m +inf.0]) ; minimum value so far
(cond
[(= i n) ; if the end is reached
m] ; return the minimum
[else ; else
(define x (vector-ref v i)) ; get new element in vector
(loop (+ i 1) ; increment index
(min m x))]))) ; new minimum
与以下相同:
(let loop ([x 1] [y 10])
(loop (+ x 1) (- y 1))
答案 1 :(得分:2)
向量可通过O(1)访问并对其进行索引,因此它是完全不同的数据结构,但是您具有SEFI-43,它类似于SRFI-1列表库,但用于向量。
#lang racket
(require srfi/43)
(define (min-element lst)
(vector-fold min (vector-ref lst 0) lst))
(max-element #(7 8 1 2 3 4 5 12))
; ==> 1