Vector 如何从球拍中的向量中求出最小整数

Vector 如何从球拍中的向量中求出最小整数,vector,scheme,racket,Vector,Scheme,Racket,我试图从只包含数字的向量中得到最小的整数。我知道如何使用列表。比较列表的前两个值,根据哪个值更大,可以保存值以便稍后输出,也可以使用cdr过程使用列表的其余部分(第一个元素除外)再次调用函数 但是有了向量,我完全迷路了。我的猜测是,对于列表和向量,思考解决方案的方式是相同的。我一直在读racket lang网站上的文章,但还没有找到解决问题的方法。我试验最多的程序是矢量参考和矢量长度,因为它们似乎在这个问题上最有用(但这是我第一次使用矢量,所以我知道些什么) 所以我的两个问题是: 如何从向量中获

我试图从只包含数字的向量中得到最小的整数。我知道如何使用列表。比较列表的前两个值,根据哪个值更大,可以保存值以便稍后输出,也可以使用cdr过程使用列表的其余部分(第一个元素除外)再次调用函数

但是有了向量,我完全迷路了。我的猜测是,对于列表和向量,思考解决方案的方式是相同的。我一直在读racket lang网站上的文章,但还没有找到解决问题的方法。我试验最多的程序是矢量参考矢量长度,因为它们似乎在这个问题上最有用(但这是我第一次使用矢量,所以我知道些什么)

所以我的两个问题是:

  • 如何从向量中获取除第一个值以外的所有值?是否有类似于cdr的程序,但适用于向量

  • 如果使用列表,则可以使用cons保存要输出的值。但在处理向量时,有没有类似的方法


  • 谢谢

    最简单的解决方案是使用
    for
    的变体,称为
    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))
    
    同:

    (let ()
       (define (loop (x y) 
         (loop (+ x 1) (- y 1)))
       (loop 1 10))
    
    向量是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
    

    另请参阅,它为向量上的函数提供了HtDP风格的设计方法。感谢您的回答!我对let语句有一个问题,因为我对它不太熟悉(这可能太多了,无法在评论中概括)。调用循环函数/过程是否正确?如果是这样,我们是否可以使用lambda表达式或define而不是let?甚至可以将函数拆分为两个单独的函数?所谓的“命名循环”确实定义了一个函数并调用它。