(方案)使用自定义地图和缩小,找到列表中的最小值

时间:2015-11-15 02:59:02

标签: list dictionary scheme multiplying

我需要使用下面的两个函数在对每个元素进行平方后找出列表中的最小值。

例如:(minSquare '(10 -2 5 9 -11)应打印出4。

映射并减少代码:

(define map
  (lambda (f l)
    (if (null? l)
        '()
        (cons (f (car l)) (map f (cdr l))))))

(define reduce
  (lambda (op l id)
    (if (null? l)
        id
        (op (car l) (reduce op (cdr l) id)))))

我试过了:

(define minSquare
  (lambda (x)
    (cond [(null? x) '()]
          [else (map minSquare (reduce * x (car x))) (minSquare (cdr x))])))

但是,它会将列表中的所有数字乘以它们的方块map然后崩溃,然后给出contract violation。我不确定如何使用这两个功能。

如果有人可以指导我(不给出答案),我将非常感激!

注意:我无法修改mapreduce

1 个答案:

答案 0 :(得分:2)

首先,您必须private <T> T[] arrayCopy(T[] original) { //get the class type of the original array we passed in and determine the type, store in arrayType Class<?> arrayType = original.getClass().getComponentType(); //declare array, cast to (T[]) that was determined using reflection, use java.lang.reflect to create a new instance of an Array(of arrayType variable, and the same length as the original T[] copy = (T[])java.lang.reflect.Array.newInstance(arrayType, original.length); //Use System and arraycopy to copy the array System.arraycopy(original, 0, copy, 0, original.length); return copy; } 在列表中对每个元素进行平方,之后使用map找到最小值。一些提示:

  • reduce接收三个参数,第一个是将每个元素与初始最小值进行比较的过程,每当我们找到一个小于当前最小值的元素时更新其值。
  • 第二个参数是要遍历的列表,在这种情况下,它是对每个元素进行平方的结果:reduce
  • 第三个参数是初始最小值,在这种情况下是一个数字,使得所有其他参数都小于它,例如正无穷大(map (lambda (n) (* n n)) x)

请注意,这里使用+inf.0有点过分,因为该语言已经为我们提供了reduce函数。