如何找到最小长度

时间:2016-01-26 16:22:04

标签: functional-programming scheme racket

我有一个X Y by X Y向量b(一个2d数组/矩阵)。此向量中的每个条目都有一个列表,其长度可以从1到X * Y元素。我想循环遍历向量的所有元素,并找出具有最小长度列表的向量的行和列(或者如果有多个返回其中一个或者所有元素也很好)。

我开始使用以下(不完整的代码)

 (define (find-minimum-row-col b X Y)
  (for*/first ([row (* X Y)]
               [col (* X Y)]               
               #:when (< ( length (vector-ref (vector-ref b row) col))) the-min-sofar))
    (cons row col)))

我不确定如何以功能方式跟踪运行的最小值和相应的坐标(即不使用-min-sofar变量上的set!)

1 个答案:

答案 0 :(得分:1)

试试这个:

(define (find-minimum-row-col a)
  (for*/fold ([the-min '(0 . 0)])
             ([row (in-range (vector-length a))]
              [col (in-range (vector-length (vector-ref a 0)))])
    (if (< (length (vector-ref (vector-ref a row) col))
           (length (vector-ref (vector-ref a (car the-min)) (cdr the-min))))
        (cons row col)
        the-min)))

诀窍是使用for*/foldthe-min变量中累积迭代结果,并根据需要更新它。我们不必传递矩阵的维度,只要矩阵非空并且所有行具有相同的列数,所有这些都可以工作。例如:

(find-minimum-row-col '#(#((1) (2 2) (3 3 3))
                         #((2 2) (1) (3 3 3))
                         #((2 2) () (2 2))))
=> '(2 . 1)