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