如何从球拍中的向量中获取最低的整数

时间:2018-10-21 16:02:50

标签: vector scheme racket

我正在尝试从仅包含数字的向量中获取最低的整数。我知道如何使用列表。您可以比较列表的前两个值,并根据哪个值较大来保存您的值以稍后输出它,或者使用 cdr 与列表的其余部分(除第一个元素外的所有元素)再次调用该函数。 strong>过程。

但是有了向量我就完全迷失了。我的猜测是,对于列表和向量,解决方案的思考方式将是相同的。我一直在读Lange-lang网站,但还没有找到解决问题的方法。我一直在尝试的过程是 vector-ref vector-length ,因为它们似乎在此问题中最有用(但这是我第一次工作带有向量,所以我知道什么。)

所以我的两个问题是:

  1. 我们如何从向量中获取除第一个值以外的所有值?是否有类似 cdr 的过程,但是针对矢量?

  2. 如果要使用列表,则可以使用 cons 保存要输出的值。但是使用向量时是否有类似的方法呢?

谢谢!

2 个答案:

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